(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(比對模式, 模式符合時回傳的值)
array("password:", "要求輸入密碼"),
array("yes/no)?", "要求輸入yes/no")
);
while (true) {
switch (expect_expectl($stream, $cases)) {
case "要求輸入密碼":
fwrite($stream, "my password\n");
break;
case "要求輸入yes/no":
fwrite($stream, "yes\n");
break;
case EXP_TIMEOUT:
case EXP_EOF:
break 2; // 跳出 switch 敘述和 while 迴圈
default:
die("發生錯誤!");
}
}
fclose($stream);
?>