как извлечь доменные имена из результата tracert / traceroute в php, не используя 'http://' и' www. ' как иголка? - PullRequest
2 голосов
/ 21 декабря 2011

Мой мотив - получить у хостинг-провайдера доменное имя, используя 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  * * *

Я хочу получить последнее действительное доменное имя, которое (в данном случае):

`10  * * te-8-1.bas-k2.sk1.yahoo.com (68.180.160.11)  41.787 ms`

Я могу легко добраться до этого, используя этот код (stristr ()):


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

Мне нужен этот результат:


    yahoo.com

должно быть от # 10 ( 10 * * te-8-1.bas-k2.sk1.yahoo.com (68.180.160.11) 41,787 мс )

У кого-нибудь есть решение этой проблемы? Или если у кого-то есть лучшее решение моей основной цели здесь.

Был бы очень признателен за любую помощь.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 декабря 2011

Хотя простое использование |cut или str_split('/\s+/') может работать для разделения и ручного извлечения, вы также можете использовать регулярное выражение с достаточной специфичностью для извлечения всех имен хостов одновременно:

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

Это зависит отДВУ, состоящий только из букв, и как минимум еще два дочерних домена.префиксы.A {1,} может быть достаточно.

0 голосов
/ 21 декабря 2011

Вы должны выполнить два шага: Шаг 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 Foundation предоставляет обновленный список доменов верхнего уровня, включая поддомен первого уровня (например, .co.uk или .ws.ru):

Список можно скачать здесь . Вам не нужно реализовывать это самостоятельно, но вы можете загрузить «готовый к запуску модуль» здесь . Загрузите его, добавьте в свой проект и запустите:

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

Обязательно обновляйте эти файлы на регулярной основе, и все должно быть настроено.

0 голосов
/ 21 декабря 2011
//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 = "";
}
...