2011-12-20 71 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' 

请务必及时更新定期基地这些文件,你应该是所有设置。

相关问题