小さな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より大きい場合(空中から引き抜かれた数だけ)、グーグルプラスリンクやフェイスブックリンクのように、ホストURLはリンクに存在しますが、文字列に沿ってはるかに遠くにあり、外部を意味します。
すなわち:http ://www.facebook.com/plugins/like.php?href = http://example.com/
ふぅ...
外部リンクまたは内部リンクを見つけるための他のより良い方法がある場合は、私に知らせてください..私の結果は、リンクがフルパスを使用している場合、サイトによって実際に異なります、