Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除页面并将内部链接与外部链接分离_Php_Dom_Web Scraping - Fatal编程技术网

Php 删除页面并将内部链接与外部链接分离

Php 删除页面并将内部链接与外部链接分离,php,dom,web-scraping,Php,Dom,Web Scraping,构建一个小小的PHP刮刀,我正在编写一个小小的函数,它应该将我的内部和外部链接分开 我将向函数传递html源代码的副本以及基本主机地址 $source = file_get_contents('http://www.example.com'); $host = "mysite.com"; 这是我到目前为止的功能 function find_page_links($source, $host){ if($source){ $htmlDo

构建一个小小的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 我创建了两个阵列来存储内部和外部

循环浏览文档并获取elementsbytagname'a'

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

因此,如果pos===false/不匹配 现在,如果主机位于链接URL中,那么我将进行另一次检查,以查看主机的位置在字符串中是否较低,这将是内部ie:

但如果位置大于20,则仅从空中抽取一个数字,然后。。 就像google plus链接或facebook链接一样,主机url将出现在链接中,但沿着字符串的距离要远得多,这意味着它是一个外部链接

即:


如果你们有其他更好的方法来发现外部或内部链接,请让我知道。我的结果因网站而异,如果链接使用完整路径,

我编辑了这个问题的标签,但没有注意到这是一个老问题,因为有新用户挖了它并编辑了它的标题