构建一个小 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/
呸...
如果你们有任何其他更好的方法来发现外部或内部链接,请告诉我..我的结果,真的因站点而异,如果链接使用完整路径,