2

私の動機は、php を使用してドメイン名のホスティング プロバイダーを取得することです。任意のドメイン名 (yahoo.com) に tracert/traceroute すると、次のようになります。

    72.30.2.43 (72.30.2.43) への traceroute、最大 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 = 爆発("\n",$str);
    foreach($a as $v){
        if(!stristr($v,'* * *')){
            $v をエコーし​​ます。
'; } }

この結果が必要です:

    yahoo.com

# 10 からのはずです ( 10 * * te-8-1.bas-k2.sk1.yahoo.com (68.180.160.11) 41.787 ms )

誰にもこれに対する解決策がありますか?または、誰かがここで私の基本的な目的に対するより良い解決策を持っている場合.

本当に助けていただければ幸いです。

ありがとうございました!

4

3 に答える 3

0

2 つの手順を実行する必要があります。手順 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: 「トップレベル」のホスト名を特定します。

世界中で新しいドメインが絶えず出現しているため、これはかなり面倒な作業です。.co.ukインターネットのおかげで、問題を抱えているのはあなただけではありません。Mozilla Foundation は、トップ レベルのサブドメイン (や など.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 に答える
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

|cutまたはを使用するだけstr_split('/\s+/')で、分割と手動抽出に機能する可能性がありますが、すべてのホスト名を一度に抽出するのに十分な特異性を持つ正規表現を使用することもできます。

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

これは、文字のみの TLD と、少なくとも 2 つのサブドメインに依存します。プレフィックス。{1,}ただし、十分な場合があります。

于 2011-12-20T23:03:01.810 に答える