2011-12-20 68 views
2

我的動機是使用php獲取域名的託管提供商。 當tracert的/跟蹤路由到任何域名(yahoo.com),它提供了:如何在不使用'http://'和'www'的情況下從php中獲取tracert/traceroute域名。作爲針?

 

    traceroute to 72.30.2.43 (72.30.2.43), 30 hops max, 40 byte packets 
    1 c1.25.78ae.static.theplanet.com (174.120.37.193) 0.648 ms 0.630 ms 0.647 ms 
    2 te6-2.dsr02.dllstx2.networklayer.com (70.87.254.237) 0.365 ms 0.430 ms 0.462 ms 
    3 te7-4.dsr02.dllstx3.networklayer.com (70.87.253.121) 0.562 ms te4-3.dsr02.dllstx3.networklayer.com (70.87.255.129) 0.910 ms te4-4.dsr02.dllstx3.networklayer.com (70.87.255.133) 0.664 ms 
    4 ae17.bbr01.eq01.dal03.networklayer.com (173.192.18.226) 0.403 ms ae17.bbr02.eq01.dal03.networklayer.com (173.192.18.230) 0.380 ms 0.405 ms 
    5 ae1.bbr01.cf01.den01.networklayer.com (173.192.18.139) 14.864 ms 14.723 ms 14.770 ms 
    6 ae1.bbr01.cf01.den01.networklayer.com (173.192.18.139) 14.787 ms 198.32.216.25 (198.32.216.25) 14.882 ms 14.946 ms 
    7 198.32.216.25 (198.32.216.25) 14.863 ms ae-7.pat1.pao.yahoo.com (216.115.101.128) 38.403 ms ae-7.pat1.sjc.yahoo.com (216.115.101.149) 41.250 ms 
    8 ae-1-d420.msr1.sk1.yahoo.com (216.115.106.161) 38.930 ms ae-1-d400.msr1.sk1.yahoo.com (216.115.106.153) 41.643 ms ae-0-d210.msr2.sk1.yahoo.com (216.115.106.133) 38.617 ms 
    9 te-8-1.bas-k1.sk1.yahoo.com (68.180.160.9) 41.478 ms te-9-1.bas-k2.sk1.yahoo.com (68.180.160.15) 39.368 ms ae-0-d230.msr2.sk1.yahoo.com (216.115.106.141) 42.650 ms 
    10 * * te-8-1.bas-k2.sk1.yahoo.com (68.180.160.11) 41.787 ms 
    11 * * * 
    12 * * * 
    13 * * * 
    14 * * * 
    15 * * * 
    16 * * * 
    17 * * * 
    18 * * * 
    19 * * * 
    20 * * * 
    21 * * * 
    22 * * * 
    23 * * * 
    24 * * * 
    25 * * * 
    26 * * * 
    27 * * * 
    28 * * * 
    29 * * * 
    30 * * * 

我想最後一個有效的域名,這是(在這種情況下):

`10 * * te-8-1.bas-k2.sk1.yahoo.com (68.180.160.11) 41.787 ms`

我可以通過使用此代碼得到這個容易(stristr()):

 

    $a = explode("\n",$str); 
    foreach($a as $v){ 
     if(!stristr($v,'* * *')){ 
      echo $v.'
'; } }

我需要這樣的結果:

 

    yahoo.com 

它應該是從10#( 10 * te-8-1.bas-k2.sk1.yahoo.com(68.180.160.11)41.787毫秒

有沒有人有一個解決這個問題?或者如果有人在這裏更好地解決我的基本目標。

真的很感激任何幫助。

謝謝!

+0

你會從'10 * * te-8-1.bas-k2.sk1.yahoo.co.uk(68.180.160.11)41.787 ms)'這一行中期待哪個答案?我猜'yahoo.co.uk'? – 2011-12-20 23:01:01

+0

是的,沒錯。 – 2011-12-20 23:04:03

+0

謝謝@Cassy – 2011-12-20 23:07:30

回答

0
//Cut the excess off. 

$starPos = strpos($str,'* * *'); 
$subSet = substr($str,0,$starPos); 
$a = explode("\n",$subSet); 
$last = $a[count($a)-2] ; 

//Preg match the domain 
echo "RESULT: "; 
if (preg_match('/\.([^\.]*?\.[^\.]*?)\s\(\d/i', $last, $regs)) { 
    echo $result = $regs[1]; 
} else { 
    echo $result = ""; 
} 
+0

這實際上只會「返回」bas-k2.sk1.yahoo.com「(第一部分被跳過)。最好試試'/ \ s([^(] +)\ s \(/ i')來獲得完整的主機名。 – 2011-12-20 23:00:11

+0

是的,在那裏有一些錯誤,這雖然工程,雖然,本地測試 – 2011-12-20 23:04:56

+0

謝謝@saratis – 2011-12-20 23:06:27

0

雖然只是用|cutstr_split('/\s+/')可能適用於分裂和人工提取,還可以使用正則表達式有足夠的特異性,一次提取所有主機名:

preg_match_all('/(?<=\s)([\w-]+\.){2,}[a-z]+(?=\s\()/', $tracert, $m); 
print_r($m[0]); 

這取決於一個字母只有頂級域名,以及最少兩個子域名。前綴。然而,A {1,}可能就足夠了。

+0

謝謝你的幫助,真的學到了很多:) – 2011-12-20 23:05:15

0

你必須執行兩個步驟:第1步是提取從陣列的最後一個主機名:

$a = explode("\n",$str); 
$hosts = preg_grep('/\s[^(]+\s\(/', $a); 
$lastHost = $hosts[count($hosts)-1]; 
if (preg_match('/\s([^(]+)\s\(/i', $lastHost, $result)) { 
    $hostname = $result[1]; 
} 
// this will give you "te-8-1.bas-k2.sk1.yahoo.com" 

步驟2:確定「頂級」主機名。

這是一個相當乏味的任務,因爲世界各地不斷有新的領域出現。感謝互聯網,你不是一個人的問題:Mozilla基金會提供的頂級域名,包括他們的第一級子域名(如.co.uk.ws.ru)的最高最新名單:

列表可以下載here 。不過,您不必自行實施,但您可以下載「準備運行模塊」here。下載它,把它添加到您的項目並運行它:

require_once 'effectiveTLDs.inc.php'; 
require_once 'regDomain.inc.php'; 
$realHostname = getRegisteredDomain($hostname); 
// gives you 'yahoo.com' 

請務必及時更新定期基地這些文件,你應該是所有設置。

相關問題