2

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

    traceroute 到 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 毫秒 te4-3.dsr02.dllstx3.networklayer.com (70.87.255.129) 0.910 毫秒 te4-4.dsr02.dllstx3.networklayer.com (70.87) .255.133) 0.664 毫秒
     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 毫秒 14.723 毫秒 14.770 毫秒
     6 ae1.bbr01.cf01.den01.networklayer.com (173.192.18.139) 14.787 毫秒 198.32.216.25 (198.32.216.25) 14.882 毫秒 14.946 毫秒
     7 198.32.216.25 (198.32.216.25) 14.863 毫秒 ae-7.pat1.pao.yahoo.com (216.115.101.128) 38.403 毫秒 ae-7.pat1.sjc.yahoo.com (216.115.101.149) 41.250 毫秒
     8 ae-1-d420.msr1.sk1.yahoo.com (216.115.106.161) 38.930 毫秒 ae-1-d400.msr1.sk1.yahoo.com (216.115.106.153) 41.643 毫秒 ae-0-d210.msr2.sk1 .yahoo.com (216.115.106.133) 38.617 毫秒
     9 te-8-1.bas-k1.sk1.yahoo.com (68.180.160.9) 41.478 毫秒 te-9-1.bas-k2.sk1.yahoo.com (68.180.160.15) 39.368 毫秒 ae-0-d230 .msr2.sk1.yahoo.com (216.115.106.141) 42.650 毫秒
    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 = explode("\n",$str);
    foreach($a 作为 $v){
        if(!stristr($v,'* * *')){
            回声$v。
'; } }

我需要这个结果:

    雅虎网

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

有人对此有解决方案吗?或者,如果有人对我的基本目标有更好的解决方案。

非常感谢任何帮助。

谢谢!

4

3 回答 3

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 = "";
}
于 2011-12-20T22:52:57.877 回答
0

虽然仅使用|cutorstr_split('/\s+/')可能适用于拆分和手动提取,但您还可以使用具有足够特异性的正则表达式来一次提取所有主机名:

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

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

于 2011-12-20T23:03:01.810 回答
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):

该列表可以在这里下载。不过,您不必自己实现此功能,但您可以在此处下载“准备运行模块” 。下载它,将其添加到您的项目并运行它:

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

确保定期更新这些文件,您应该已经准备就绪。

于 2011-12-20T23:23:01.697 回答