2011年09月04日

[php] WEBページ内のリンク先URLをすべて取得するこのエントリーをはてなブックマークに追加

URLを投げると、そのページにある<a href=> タグを全部拾って
リンク先URLを配列で返してくれるコード。

相対リンクを絶対リンクに変換するというのが肝。

やっとできた・・・・。結局、人のソースまるもらいました...。

PHP/PHP入門/正規表現/リンク抜き出し - WebTips

こちらのサイト様に大感謝でございます。
そのコードが拾ったリンク先URLをechoするものだったので、
$linkarrayという配列に入れるように改造させてもらいました。


■ テスト


サイトマップ -首相官邸ホームページ-

1

ここに対して実行する(ソース3行目の$urlで指定する)と↓

■ 結果


2
Array
(
[0] => http://www.kantei.go.jp/
[1] => http://www.kantei.go.jp/jp/kan/profile/index.html
[2] => http://www.kantei.go.jp/jp/kan/actions/index.html
[3] => http://www.kantei.go.jp/jp/kan/statement/index.html
[4] => http://www.kantei.go.jp/jp/kan/yotei/index.html
[5] => http://www.kantei.go.jp/jp/tyoukanpress/index.html
[6] => http://www.kantei.go.jp/jp/tyokan/kan/index.html
[7] => http://www.kantei.go.jp/jp/singi/index.html
[8] => http://www.cas.go.jp/jp/pubcom/index.html
[9] => https://www.kantei.go.jp/jp/forms/goiken_ssl.html
[10] => http://kanfullblog.kantei.go.jp/
[11] => http://www.mmz.kantei.go.jp/jp/blog/kan/index.html
[12] => http://www.mmz.kantei.go.jp/jp/blog/kan/touroku.html
[13] => http://www.mmz.kantei.go.jp/jp/m-magazine/henkou.html
[14] => https://www.kantei.go.jp/jp/forms/dokushaqa_ssl.html
[15] => http://www.kantei.go.jp/jp/
[16] => http://www.kantei.go.jp/jp/rekidaisouri-index.html
[17] => http://www.kantei.go.jp/jp/rekidai/index.html
[18] => http://www.kantei.go.jp/jp/kakugi/index.html
[19] => http://www.kantei.go.jp/jp/kanteinougoki/index.html
[20] => http://www.clb.go.jp/contents/index.html
[21] => http://www.kantei.go.jp/jp/kakugikettei/index.html
[22] => http://www.kantei.go.jp/jp/kanpo_hakusyo.html
[23] => http://www.kantei.go.jp/jp/link.html
[24] => http://www.kantei.go.jp/foreign/index-e.html
[25] => http://www.kantei.go.jp/rss.html
[26] => http://www.kantei.go.jp/index-j2.rdf
[27] => http://www.kantei.go.jp/jp/policy/privacy_policy.html
[28] => http://www.kantei.go.jp/jp/terms.html
)

こうなります。

コードについては、何をしてるのかさっぱりわかりません!
まー、とりあえず、これであれをそーすれば、自動でダウンロードするあれが作れるはず!


■ ソース


<?php
echo '<pre>';

$url = "http://www.kantei.go.jp/sitemap.html";
print_r(getLinks($url));


// urlからページ内にあるAリンクを抽出し配列を返す関数
// http://webtips.open-log.net/index.php?PHP%2FPHP入門%2F正規表現%2Fリンク抜き出し のものを改造
function getLinks($originalurl){
// 抽出されたリンク先を格納する配列
$linkarray = array();
$urlpat = '/^(https?|ftp)(:\/\/)([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/';
if(isset($originalurl) && preg_match($urlpat, $originalurl,$reg1)){
echo $reg1[0]."<br />";
$url = $reg1[3];
$urlarr = explode("/",$url);
$protocol = $reg1[1];
$homedir = $protocol."://".getHomeDir($url);
if(! preg_match("|.+/$|",$homedir)) $homedir = $homedir."/";//スラッシュで終わってない場合は付加
// echo "URLのホームディレクトリ:" .$homedir;
if($html = file_get_contents($originalurl)){
$html = mb_convert_encoding($html,"UTF-8",mb_detect_encoding($html));
$linkpat = "/<a[^>]+href=[\"']?([-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)[\"']?[^>]*>(.*?)<\/a>/ims";
if(preg_match_all($linkpat, $html, $reg)){
$reg[0] = "";
if(count($reg) > 0){
$cnt = count($reg[1]);
for($i=0;$i<$cnt;$i++){
if(preg_match("/^http/i",$reg[1][$i])){ //httpからはじまる
$link = $reg[1][$i];
}elseif(preg_match("|^/|",$reg[1][$i])){ // スラッシュからはじまる
$link = $protocol."://".$urlarr[0].$reg[1][$i];
}else{ //上記以外
$link = $homedir.$reg[1][$i];
}
$linkarray[] = $link;
}
}
}
}else{
$linkarray[] = $url;
}
}
return $linkarray;
}

// Aリンク抽出時、相対リンクにドメイン名等を付与するのに使う関数(と思われる)
function getHomeDir($url){
if(preg_match("/^(.+?)\?(.+)$/",$url,$reg)){ //?で変数を渡している場合は?の前までを抽出
$url = $reg[1];
}
if(preg_match("|^(.+/)[^/]*$|",$url,$reg)){ //最後のスラッシュまで
return $reg[1];
}else{
return $url;
}
}
?>




この記事へのコメント

気がついたので一応 ┐ : 2013年07月16日 19:52
ソースの22行目

echo $reg[0]."";
というのは

echo $reg1[0]."";

ですな

気がついたので一応 ┐ : 2013年07月16日 19:54
すみません、なぜ22行目と言ってしまったのかわかりませんが、15行目のことを言いたかったです。

くじ ┐ : 2013年07月17日 00:31
どうもご指摘ありがとうございます〜。
チェックもしてませんが言われたまま直しときました!

 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/qoozy/52488858