我的动机是使用php获取域名的托管服务提供商。 当tracert / traceroute到任何域名(yahoo.com)时,它给出:
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
它应该来自#10th( 10 * * te-8-1.bas-k2.sk1.yahoo.com(68.180.160.11)41.787 ms )
有没有人有解决方案?或者如果有人在这里有更好的解决方案来解决我的基本目标。
非常感谢任何帮助。
谢谢!
答案 0 :(得分: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 = "";
}
答案 1 :(得分:0)
虽然仅使用|cut
或str_split('/\s+/')
可能适用于拆分和手动提取,但您也可以使用具有足够特异性的正则表达式一次提取所有主机名:
preg_match_all('/(?<=\s)([\w-]+\.){2,}[a-z]+(?=\s\()/', $tracert, $m);
print_r($m[0]);
这取决于仅限字母的TLD,以及最少两个sub.domain。前缀。但是{1,}
可能就足够了。
答案 2 :(得分: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 Foundation提供了顶级域名的最新列表,包括他们的第一级子域名(如.co.uk
或.ws.ru
):
可以下载列表here。但是,您不必自己实现此功能,但可以下载“准备运行模块”here。下载它,将其添加到您的项目并运行它:
require_once 'effectiveTLDs.inc.php';
require_once 'regDomain.inc.php';
$realHostname = getRegisteredDomain($hostname);
// gives you 'yahoo.com'
确保定期更新这些文件,您应该全部设置。