2012-05-12 13 views
4

XPathを使用して、すべての内部リンクを取得するためのHTML Webページを解析します。 DOMXPathhrefで提供されるすべてのリンクを返します。内部の外部リンクを分離するにはどうすればよいですか?ウェブページから内部リンクを取得するにはどうすればよいですか?

外部リンクを削除する一連の文字列チェックを導入しました。しかし、問題は、このような他のドメインへの内部リンク(サブドメインを含む、本ドメインへのリンク)および外部リンクを(区別するための最も安全な方法は何ですか

page.html 
    /page.html 
    http://domain.com/page.html 
    http://subdomain.domain.com/page.html 
    .... 

などの内部ページをリンクするためのさまざまな方法があるということです)。

答えて

0

substr()を使用して、最初の4文字がhttpであるかどうかを確認します。

もしそうなら、parse_url()関数を使用して、ホストが同じかどうかを確認します。 そうでなければ、それは内部です。

+0

DOMによって提供されるリストは必ずしも完全なURLである必要はありません。この例で与えられているように '/ page.html'を返すこともできます。 – Googlebot

+0

これは機能しましたか? – Jeroen

+0

実際には、 'parse_url()'の 'host'はドメイン/サブドメインを認識できません。 PHPでは 'サブドメイン 'を検出する機能がないため、おそらく解決できません。 – Googlebot

2

私はpreg_matchを使って書いた小さな例です。それが役に立ったら教えてください。

<?php 
function get_a_href($url){ 
    $url = htmlentities(strip_tags($url)); 
    $ExplodeUrlInArray = explode('/',$url); 
    $DomainName = $ExplodeUrlInArray[2]; 
    $file = @file_get_contents($url); 
    $h1count = preg_match_all('/(href=["|\'])(.*?)(["|\'])/i',$file,$patterns); 
    $linksInArray = $patterns[2]; 
    $CountOfLinks = count($linksInArray); 
    $InternalLinkCount = 0; 
    $ExternalLinkCount = 0; 
    for($Counter=0;$Counter<$CountOfLinks;$Counter++){ 
    if($linksInArray[$Counter] == "" || $linksInArray[$Counter] == "#") 
     continue; 
    preg_match('/javascript:/', $linksInArray[$Counter],$CheckJavascriptLink); 
    if($CheckJavascriptLink != NULL) 
    continue; 
    $Link = $linksInArray[$Counter]; 
    preg_match('/\?/', $linksInArray[$Counter],$CheckForArgumentsInUrl); 
    if($CheckForArgumentsInUrl != NULL) 
    { 
    $ExplodeLink = explode('?',$linksInArray[$Counter]); 
    $Link = $ExplodeLink[0]; 
    } 
    preg_match('/'.$DomainName.'/',$Link,$Check); 
    if($Check == NULL) 
    { 
    preg_match('/http:\/\//',$Link,$ExternalLinkCheck); 
    if($ExternalLinkCheck == NULL) 
    { 
    $InternalDomainsInArray[$InternalLinkCount] = $Link; 
    $InternalLinkCount++; 
    } 
    else 
    { 
    $ExternalDomainsInArray[$ExternalLinkCount] = $Link; 
    $ExternalLinkCount++; 
    } 
    } 
    else 
    { 
    $InternalDomainsInArray[$InternalLinkCount] = $Link; 
    $InternalLinkCount++; 
    } 
    } 
    $LinksResultsInArray = array(
    'ExternalLinks'=>$ExternalDomainsInArray, 
    'InternalLinks'=>$InternalDomainsInArray 
    ); 
    return $LinksResultsInArray; 
    } 
    ?> 
関連する問題