构建一个小的PHP scrapper,我正在编写一个小功能,它应该将我的内部和外部分开。外部链接,
我正在将函数传递给html源代码的副本以及基本主机地址
$source = file_get_contents('http://www.mysite.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检查主机地址“mysite.com”是否在链接URL中如果没有匹配/ false然后它是外部的,但我们进一步检查以确保链接URL不是以正斜线即:“ /contact-us.php ”,这意味着它是一个内部,也在检查中我们检查开头的“#”标签是页面上的锚链接...
所以那是IF pos === false /不匹配 now如果主机在链接URL中是匹配的,我会再做一次检查,看看主机的位置是否在字符串中较低,这是内部的,即: http://mysite.com/about/
但是如果位置大于20(只是一个从空中拔出的数字)那么...... 像谷歌加链接或Facebook链接主机网址将出现在链接中,但更多沿着字符串,这将意味着它的外部,
ie:http://www.facebook.com/plugins/like.php?href=http://mysite.com/
...呼
如果你们有其他更好的方法来发现外部或内部链接,请告诉我..我的结果,根据网站的不同,如果链接使用完整路径,