(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 | 字符串 | 模式,将与流的输出进行匹配 | 是 | |
1 | 混合 | 值,如果模式匹配,则此函数将返回该值 | 是 | |
2 | 整数 | 模式类型,其中之一:
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(pattern, value to return if pattern matched)
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; // break both the switch statement and the while loop
default:
die("发生错误!");
}
}
fclose($stream);
?>