如何在PHP中从tracert/traceroute结果中获取域名而不使用'http://'和& # 3


how to fetch domain names from a tracert/traceroute result in php without using 'http://' and 'www.' as needle?

我的动机是使用php获得域名的托管提供商。当tracert/traceroute到任何域名(yahoo.com)时,它给出:

<>之前Traceroute到72.30.2.43(72.30.2.43),最大30跳数,40字节包1.中文:1.中文2 te6-2.dsr02.dllstx2.networklayer.com (70.87.254.237) 0.365 ms 0.430 ms 0.462 mste4-4.dsr02.dllstx3.networklayer.com (70.87.255.129) 0.910 ms te4-4.dsr02.dllstx3.networklayer.com (70.87.255.133) 0.664 ms4 . ae17.bbr02.eq01.dal03.networklayer.com (173.192.18.226) 0.403 ms5 ae1.bbr01.cf01.den01.networklayer.com (173.192.18.139) 14.864 ms 14.723 ms 14.770 ms3.网络层网(173.192.18.139)14.787 msae-7.pat1.sjc.yahoo.com (216.115.101.149ae-1-d400.msr1.sk1.yahoo.com (216.115.106.1539. te-8-1.bas- k2.sk1.yahoo.com (68.180.160.1510 * * te-8-1.bas-k2.sk1.yahoo.com11 * * *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 = explosion ("'n",$str);Foreach ($a = $v){如果(!strstr ($v,'* * *')){echo $ v。
";}}之前

我需要这个结果:

<>之前yahoo.com之前

应该是从# 10 (10 * * te-8-1.bas-k2.sk1.yahoo.com (68.180.160.11) 41.787 ms)

有人有解决办法吗?或者如果有人有更好的解决方案来实现我的基本目标。

非常感谢您的帮助。

谢谢!

//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 = "";
}

虽然仅使用|cutstr_split('/'s+/')可能用于拆分和手动提取,但您也可以使用具有足够特异性的regex来一次提取所有主机名:

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

这取决于一个纯字母TLD,以及至少两个以上的子域名。前缀。然而,{1,}可能就足够了。

您必须执行两个步骤:步骤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):

名单可在此下载。您不必自己实现它,但是您可以在这里下载一个"准备运行模块"。下载它,将它添加到您的项目中并运行它:

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

确保定期更新这些文件,您应该都设置好了。