2011-12-20 3 views
2

내 동기 PHP를 사용하여 도메인 이름의 호스팅 제공 업체를 얻는 것입니다. 는 도메인 이름 (yahoo.com)에 TRACERT/경로 추적, 그것은 제공하는 경우 :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`

나는() (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 MS)

는 사람이있다니까 이것에 대한 해결책? 아니면 누군가 내 기본 목표에 대한 더 나은 해결책을 가지고 있다면.

정말 도움이됩니다.

감사합니다.

+0

'10 * * te-8-1.bas-k2.sk1.yahoo.co.uk (68.180.160.11) 41.787 ms)와 같은 줄에서 답을 얻을 수있는 답변은 무엇입니까? 나는'yahoo.co.uk'을 추측합니까? –

+0

네, 맞습니다. –

+0

감사합니다. @ 카시 –

답변

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

감사합니다 @ saratis –

0

단지 분할 및 수동 추출을 위해 작동 할 수 |cut 또는 str_split('/\s+/')을 사용하는 동안, 당신은 또한 한 번에 모든 호스트 이름을 추출하기 위해 충분한 특이 정규식을 사용할 수 있습니다

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

이것은 문자에 따라 달라집니다 -only TLD 및 최소 두 개의 sub.domain. 접두사. 그러나 {1,}이면 충분할 수 있습니다.

+0

정말 고맙습니다. :) –

0

당신은 두 단계를 수행해야합니다

$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을 다운로드 할 수 있습니다

: 모질라 재단은 첫 번째 수준의 하위 도메인 (같은 .co.uk 또는 .ws.ru)를 포함하여 최상위 도메인의 최신 목록을 제공합니다 . 그래도 직접 구현할 필요는 없지만 "ready-to-run-module"here을 다운로드 할 수 있습니다. 다운로드하여 프로젝트에 추가하고 실행하십시오.

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

이 파일을 정기적으로 업데이트해야 모든 설정을 완료해야합니다.