我正在使用 PHPTelnet.php 类(http://www.geckotribe.com/php-telnet/)通过 telnet 命令从我的路由器获取 WAN IP。它是这样的:
require_once "PHPTelnet.php";
$telnet = new PHPTelnet();
$telnet->show_connect_error=0;
$result = $telnet->Connect('192.168.0.1','username','password');
switch ($result) {
case 0:
$telnet->DoCommand('sys ddns display', $result);
echo $result;
$telnet->DoCommand('exit', $exit);
echo $exit;
$telnet->Disconnect();
break;
有用。当我回显 $result 时,我可以看到许多这样的设置:
sys ddns 显示 DDNS 状态 state = 0, flags = 1 pauseTime = 0, timerID = 0 startcnt = 2, stopcnt = 1 retrycnt = 0, eventqcnt = 0 socketID = -1 DomainName = eMail Address = update IP = XXX.XXX.XXX .XXX更新时间 = 周四 00:00:00。1970 年 1 月 1 日 retCode = 好
因为我只对获取XXX.XXX.XXX.XXX(WAN IP)感兴趣,所以我做一个 preg_match 从 $result 获取 IP。问题来了。我总是收到这个错误:
未定义的偏移量:1
基本上这意味着 preg_match 找不到任何匹配项。我使用此代码来匹配 IP:
$regex = '/\IP = ([^\"]*?)\ /';
preg_match($regex, $result, $matches);
它正确匹配IP。事实上,如果我尝试使用这样的东西,它就可以工作。
$result = "sys ddns display DDNS Status state = 0, flags = 1 pauseTime = 0, timerID = 0 startcnt = 2, stopcnt = 1 retrycnt = 0, eventqcnt = 0 socketID = -1 DomainName = eMail Address = update IP = XXX.XXX.XXX.XXX update time = 00:00:00 Thu. Jan. 01, 1970 retCode = good tc> ";
$regex = '/\IP = ([^\"]*?)\ /';
preg_match($regex, $result, $matches);
print_r($matches);
问题似乎是直接来自$telnet->DoCommand('sys ddns display', $result); 的 $result 只能回显但不能用作字符串。为什么?这有什么意义?我怎样才能真正将 telnet 响应作为真实变量?