如何在php中从tracert/traceroute结果获取域名而不使用';http://';和';www.';像针一样?
我的动机是使用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 * * * 追踪路由到72.30.2.43(72.30.2.43),最多30跳,40字节数据包 1 c1.25.78ae.static.theplanet.com(174.120.37.193)0.648毫秒0.630毫秒0.647毫秒 2 te6-2.dsr02.dllstx2.networklayer.com(70.87.254.237)0.365毫秒0.430毫秒0.462毫秒 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毫秒ae17.bbr02.eq01.dal03.networklayer.com(173.192.18.230)0.380毫秒0.405毫秒 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 7198.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毫秒 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毫秒` 我可以通过使用以下代码(stristr())轻松实现这一点: $a=爆炸(“\n”,$str); foreach($a作为$v){ 如果(!stristr($v,***')){ 回声$v.“如何在php中从tracert/traceroute结果获取域名而不使用';http://';和';www.';像针一样?,php,regex,traceroute,Php,Regex,Traceroute,我的动机是使用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.ne
”; } } 我需要这个结果: yahoo.com 雅虎网站 应该是从#10开始(10**te-8-1.bas-k2.sk1.yahoo.com(68.180.160.11)41.787毫秒) 有人能解决这个问题吗?或者如果有人对我的基本目标有更好的解决方案 非常感谢您的帮助
谢谢大家! 虽然仅使用
|cut
或str_split('/\s+/')
可以用于拆分和手动提取,但也可以使用具有足够特异性的正则表达式一次提取所有主机名:
//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 = "";
}
preg_match_all('/(?<=\s)([\w-]+\.){2,}[a-z]+(?=\s\()/', $tracert, $m);
print_r($m[0]);
preg_match_all('/(?当仅使用|cut
或str_split('/\s+/')
可能用于拆分和手动提取时,您还可以使用具有足够特异性的正则表达式一次提取所有主机名:
preg_match_all('/(?<=\s)([\w-]+\.){2,}[a-z]+(?=\s\()/', $tracert, $m);
print_r($m[0]);
preg_match_all('/(?您必须执行两个步骤:步骤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.U/<代码>或<代码> .W.Ru):
可以下载该列表。不过,您不必自己实现此功能,但可以下载“准备运行模块”。下载该模块,将其添加到项目中并运行:
require_once 'effectiveTLDs.inc.php';
require_once 'regDomain.inc.php';
$realHostname = getRegisteredDomain($hostname);
// gives you 'yahoo.com'
请确保定期更新这些文件,您应该已完成所有设置。您必须执行两个步骤:步骤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.U/<代码>或<代码> .W.Ru):
可以下载该列表。不过,您不必自己实现此功能,但可以下载“准备运行模块”。下载该模块,将其添加到项目中并运行:
require_once 'effectiveTLDs.inc.php';
require_once 'regDomain.inc.php';
$realHostname = getRegisteredDomain($hostname);
// gives you 'yahoo.com'
请确保定期更新这些文件,您应该已经准备好了。这实际上“仅”返回bas-k2.sk1.yahoo.com
(跳过第一部分)。最好尝试/\s([^(]+)\s\(/i
)获取完整的主机名。是的,其中有一些错误,但这是可行的,在本地进行测试这实际上“仅”返回bas-k2.sk1.yahoo.com
(跳过第一部分)。最好尝试/\s([^(+)\s\(/i
)以获取完整的主机名。是的,其中有一些错误,但这是可行的,在本地测试了它。您希望从10**te-8-1.bas-k2.sk1.yahoo.co.uk(68.180.160.11)41.787 ms)这样的行中得到哪个答案
?我猜雅虎公司英国
?你希望从10**te-8-1.bas-k2.sk1.yahoo.co.uk(68.180.160.11)41.787 ms)这样的行中得到哪个答案?