2011-12-20 4 views
2

私の動機は、PHPを使用してドメイン名のホスティングプロバイダを取得することです。tracert/tracerouteからドメイン名を取得する方法は、 'http://'と 'www'を使用せずにphpで行います。針として?

 

    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`
任意のドメイン名(yahoo.com)へのtracert/tracerouteを、それが与える

私はこのコード(stristr())を使って、簡単にこれを取得することができます

 

    $a = explode("\n",$str); 
    foreach($a as $v){ 
     if(!stristr($v,'* * *')){ 
      echo $v.'
'; } }

私はこの結果を必要とします

それは#10日からでなければなりません( 10 * * te-8-1.bas-k2.sk1.yahoo.com(68.180.160.11)41.787ミリ秒

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

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

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

+0

「10 * * te-8-1.bas-k2.sk1.yahoo.co.uk(68.180.160.11)41.787 ms)のような行から、あなたはどの答えを期待しますか?私は 'yahoo.co.uk'と思いますか? –

+0

はい、そうです。 –

+0

@Cassy –

答えて

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 = ""; 
} 
+0

ありがとうございました。これは実際には '' bas-k2.sk1.yahoo.com'(最初の部分はスキップされます)を返します。より良い '/ \ s([^(] +)\ s \(/ i')を試してみてください。 –

+0

はい、そこにいくつかのエラーがありましたが、これは動作しますが、ローカルでテストしました –

+0

@サラタイスありがとうございます –

0

だけ分割し、手動抽出のために働くかもしれない|cutまたはstr_split('/\s+/')を使用している間、あなたも一度にすべてのホスト名を抽出するために十分な特異性で正規表現を使用することができます。

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

これは文字に依存します-only TLD、および最低2つのsub.domain。接頭辞。しかし、{1,}で十分かもしれません。

+0

本当に多くを学んだあなたの助けてくれてありがとう:) –

0

は、次の2つの手順を実行する必要があります

$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:「トップレベル」のホスト名を特定するステップ1は、配列から最後のホスト名を抽出することです。

新しいドメインが世界中に絶えずポップアップしているので、これはやや面倒な作業です。インターネットのおかげで、あなたは問題を持つ人ではありません。リストはhereをダウンロードすることができ

:Mozilla Foundationは彼らの最初のレベルのサブドメイン(のような.co.ukまたは.ws.ru)を含むトップレベルドメインの最新のリストを提供します。あなた自身でこれを実装する必要はありませんが、実行準備が整ったモジュールhereをダウンロードすることができます。それをダウンロードし、プロジェクトに追加し、それを実行します。

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

定期的なベースの上にこれらのファイルを更新するようにしてください、あなたはすべて設定する必要があります。

関連する問題