0

我正在使用 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 响应作为真实变量?

4

1 回答 1

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;
}
于 2013-07-07T14:28:21.707 回答