如何在php中从tracert/traceroute结果获取域名而不使用';http://';和';www.';像针一样?

如何在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

我的动机是使用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.“
”; } } 我需要这个结果:

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)这样的行中得到哪个答案?