我正在使用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 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 更新时间= 00:00:00周四1970年1月1日retCode = good
由于我只对获得 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响应作为真正的变量?
答案 0 :(得分:0)
固定。这是我的懒惰正则表达式的一个问题。它适用于此:
function GetIP($string)
{
preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/", $string, $matches);
$ip = $matches[0];
return $ip;
}