4

私はXPathすべての内部リンクをフェッチするためにHTMLWebページを解析するために使用します。DOMXPathで提供されるすべてのリンクを返しますhref。内部外部リンクをどのように分離できますか?

外部リンクを削除するための一連の文字列チェックを紹介します。しかし、問題は、次のような内部ページをリンクするさまざまな方法があることです。

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

内部リンク(サブドメインを含む現在のドメインへのリンク)と外部リンク(他のドメインへのリンク)を区別する最も安全な方法は何ですか。

4

2 に答える 2

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;
    }
    ?>
于 2013-09-17T19:01:26.183 に答える
0

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

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

于 2012-05-12T19:32:18.173 に答える