1

构建一个小 PHP刮板,我正在编写一个小函数,它应该分隔我的内部和外部链接,

我正在向函数传递 html 源代码的副本以及基本主机地址

$source = file_get_contents('http://www.example.com');
$host   = "mysite.com";

到目前为止,这是我的功能...

function find_page_links($source, $host){

    if($source){
        
    $htmlDoc = new DomDocument();
    @$htmlDoc->loadhtml($source);
        
    $int_links = array();
    $ext_links = array();
    
    // GET LINKS
    foreach($htmlDoc->getElementsByTagName('a') as $link) {
            
        $url   = trim($link->getAttribute('href'));
        $title = trim($link->getAttribute('title'));
        $text  = trim($link->nodeValue);
        $rel   = trim($link->getAttribute('rel'));
            
        $pos = strpos($url,$host);
            
        if( $pos === false ){ // NO MATCH EXTERNAL              
            if( (substr($url, 0, 1) == '/') || 
                        (substr($url, 0, 1) == '#') )
                    {
            // INTERNAL
            $int_links[] = array( 'link_url' => $url, 
                                          'link_text' => $text, 
                                          'link_title' => $title, 
                                          'link_rel' => $rel 
                                        );
            }else{
            // EXTERNAL
            $ext_links[] = array( 'link_url' => $url, 
                                          'link_text' => $text, 
                                          'link_title' => $title, 
                                          'link_rel' => $rel 
                                        );
            }
        }else{
             if( $pos < 20 ){
             // INTERNAL
             $int_links[] = array( 'link_url' => $url, 
                                       'link_text' => $text, 
                                       'link_title' => $title, 
                                       'link_rel' => $rel );
             }else{
             // EXTERNAL
             $ext_links[] = array( 'link_url' => $url, 
                                         'link_text' => $text, 
                                         'link_title' => $title, 
                                         'link_rel' => $rel 
                                        );  
             }
        } // end else
    } // end foreach
        
    $content = array();
    $content['int_links'] = $int_links;
    $content['ext_links'] = $ext_links;
        
    return $content ;
  }
}

所以发生的事情是函数通过 DomDocument 加载 HTML 我创建了 2 个数组来存储内部和外部

循环遍历文档并 getElementsByTagName('a')

然后它使用 strpos 检查主机地址“example.com”是否在链接 URL 中,如果没有匹配/错误,那么它是外部的,但我们会进一步检查以确保链接 URL 不以正斜杠开头,即:“ /contact-us.php ”这意味着它是一个内部的,同样在检查中我们检查开头的“ # ”标签,这将是页面上的锚链接......

所以那是 IF pos === false / no match now 如果主机在链接 URL 中它是匹配的,我会再次检查主机的位置是否在字符串中较低,这将是内部的,即: http ://example.com/about/

但如果位置大于 20(只是从空中提取的一个数字),那么.. 就像 google plus 链接或 facebook 链接一样,主机 url 将出现在链接中,但沿着字符串更远,这意味着它是外部的,

即:http ://www.facebook.com/plugins/like.php?href=http://example.com/

呸...

如果你们有任何其他更好的方法来发现外部或内部链接,请告诉我..我的结果,真的因站点而异,如果链接使用完整路径,

4

0 回答 0