(PECL expect >= 0.1.0)
expect_expectl — 等待进程输出与某个模式匹配、指定时间段过去或看到 EOF
等待进程输出与某个模式匹配、指定时间段过去或看到 EOF。
如果提供了 match
,则它将填充搜索结果。匹配字符串可以在 match[0]
中找到。匹配子字符串(根据括号)可以在 match[1]
、match[2]
等中找到,直到 match[9]
(libexpect 的限制)。
expect
一个 Expect 流,之前使用 expect_popen() 打开。
cases
一个 Expect 案例数组。每个 Expect 案例都是一个索引数组,如以下表格所述
索引键 | 值类型 | 描述 | 是否必填 | 默认值 |
---|---|---|---|---|
0 | string | 模式,将与流输出进行匹配 | 是 | |
1 | mixed | 值,如果模式匹配,则该函数将返回此值 | 是 | |
2 | integer | 模式类型,以下之一:
EXP_GLOB 、
EXP_EXACT 或
EXP_REGEXP |
否 |
EXP_GLOB |
版本 | 描述 |
---|---|
PECL expect 0.2.1 | 在 0.2.1 版本之前,match 参数中返回的是匹配字符串,而不是匹配子字符串数组。 |
示例 #1 expect_expectl() 示例
<?php
// 从远程主机复制文件:
ini_set("expect.timeout", 30);
$stream = fopen("expect://scp user@remotehost:/var/log/messages /home/user/messages.txt", "r");
$cases = array(
// 数组(模式, 如果模式匹配则返回的值)
array("password:", "asked for password"),
array("yes/no)?", "asked for yes/no")
);
while (true) {
switch (expect_expectl($stream, $cases)) {
case "asked for password":
fwrite($stream, "my password\n");
break;
case "asked for yes/no":
fwrite($stream, "yes\n");
break;
case EXP_TIMEOUT:
case EXP_EOF:
break 2; // 中断 switch 语句和 while 循环
default:
die("Error has occurred!");
}
}
fclose($stream);
?>