我使用PHPTelnet.php類(http://www.geckotribe.com/php-telnet/)通過telnet命令從我的路由器獲取WAN IP。它是這樣的:與PHP Telnet - 它適用於回聲?
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;
它的工作原理。當我回顯$結果我可以看到許多設置像這樣:
sys ddns display DDNS Status state = 0,flags = 1 pauseTime = 0,timerID = 0 startcnt = 2,stopcnt = 1 retrycnt = 0,eventqcnt = 0 socketID = -1 DomainName =電子郵件地址=更新IP = XXX.XXX.XXX.XXX更新時間= 00:00:00星期四1970年1月1日RETCODE =好
因爲我只得到XXX.XXX.XXX.XXX(WAN IP)intrested我做的preg_match從$結果得到IP地址。問題來了。我總是得到這個錯誤:
Undefined offset: 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顯示',$結果)附帶的$結果;只能回顯但不能用作字符串。爲什麼?這是什麼意思?我怎樣才能真正獲得Telnet響應作爲真正的變量?
首先在'[^ \「]'似乎沒有任何裸露相關性要搜索的數據(沒有雙引號你展示字符串中的任何,這樣就匹配任何東西),其次,正則表達式中的主要反斜槓也沒有意義(沒有什麼可以逃脫),第三,這似乎是一個不必要的複雜方式來找到你的公共IP,當你可以使用像http://whatismyipaddress.com/api(有很多免費提供相同功能的服務) – DaveRandom
我知道正則表達式製作得不好,我只是爲了測試目的而回收它,只是爲了快速理解腳本是否真的可以工作。無論如何,大聲笑我知道如何獲得我的公共IP地址:D我做的是一個更復雜的事情,我有一個家庭服務器在動態ip下,每60個secon ds通過telnet腳本獲取當前的公共IP地址,如果通過API更改,它還會更新我與註冊商的真實域的A記錄。通過這種方式,我總是可以通過訪問home.mydomain.com訪問我的家庭服務器,我的所有PC甚至手機。 – user1274113