【phpプログラム】htmlファイルのソースから、リンク先の文字列を抜き出すプログラムを書きたいのですが、参考になるサンプルを書いて頂けませんか。


例えば
【サンプルソース】
<html><head></head><body>
<a href="./test/index.html">リンク先1</a>
<a href="../test/index2.html">リンク先2</a>
<a href="/test.index3.html">リンク先3</a>
</bod>
</html>

【結果】
連想配列で、以下のように取得できたらいいのですが。
[0] "./test/index.html" => "リンク先1"
[1] "../test/index2.html" => "リンク先2"
[2] "/test.index3.html" => "リンク先3"

宜しくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/04/26 03:37:54
  • 終了:2009/04/30 06:18:22

ベストアンサー

id:y-kawaz No.3

y-kawaz回答回数1420ベストアンサー獲得回数2252009/04/26 12:30:14

ポイント100pt

そんなに大した話でもなく正規表現で一発かと。

<?php
$html = '<html><head></head><body>
<a href="./test/index.html">リン<span>ク</span>先1</a>
<a href="../test/index2.html">リンク先2</a><a href="/test.index3.html">リンク先3</a>
</bod>
</html>';

function get_link_texts($html) {
    if(preg_match_all('/<a(?:\s[^>]*)?>(.*?)(?=<\/a\s*>)/i', $html, $m)) {
        return array_map("strip_tags", $m[1]);
    }
}

print_r(get_link_texts($html));
?>

strip_tagsはaタグ内のタグを除いたテキストのみが欲しいんじゃないかと思ったので足しておきました。

id:sakata0819

ありがとうございました、最も参考になりました。

2009/04/30 06:16:59

その他の回答(2件)

id:hideo-apa No.1

あぱ回答回数24ベストアンサー獲得回数22009/04/26 05:38:48

ポイント60pt

こちらを参考にこんな感じでいかがでしょうか?

phpの正規表現で躓いています。 アンカータグのリンク先を取得したいのですが、 $str ="<a href=\"http://www.hogehoge.hoge\">あかさんた</a>"; $pattern = "<a href=\"(... - 人力検索はてな

$strList = array();

$strList[] = '<html><head></head><body>';
$strList[] = '<a href="./test/index.html">リンク先1</a>';
$strList[] = '<a href="../test/index2.html">リンク先2</a>';
$strList[] = '<a href="/test.index3.html">リンク先3</a>';
$strList[] = '</bod>';
$strList[] = '</html>';

$result = array();

$pattern = '<a href="(.*)">(.*)<\/a>.*$' ;

foreach ($strList as $str)
{
	preg_match ( "/".$pattern."/i", $str, $matches );
//	print_r($matches) . "\n";

	if (count($matches) == 3)
	{
		$result[] = $matches[1] . " => " . $matches[2];
	}
}

foreach ($result as $ret)
{
	echo $ret . "\n";
}

ただ、この方法だと、同じ行に2箇所アンカータグがあると、誤動作してしまいます。

今のところこれが限界です。

申し訳ありません。

id:sakata0819

ありがとうございました、参考になりました。

2009/04/30 06:16:25
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/04/26 08:07:12

ポイント80pt

以下にソースを示します。

抽出したいリンク文字列のパターンは $RegPat に定義しておきます。いまは、a タグで、拡張子が html|htm|shtm|shtml のものを抽出できるようにしてあります。同じ行に複数のタグがあっても処理できます。

なお、文字コードは処理系の設定に依存しています。


さらに、相対URLを絶対URLに正規化する処理を含め、我が家のホームページ「正規表現で画像ファイルのURLを取り出す」で紹介しています。参考にしてください。

<?php
$RegPat = "/\<a(.*)href=\"?([\-_\.\!\~\*\'\(\)a-z0-9\;\/\?\:@&=\+\$\,\%\#]+(html|htm|shtm|shtml))/i";

function get_url($str, &$urls) {
    global $RegPat;
    //マッチするすべての部分文字列を取り出す
    if (($n = preg_match_all($RegPat, $str, $arr, PREG_SET_ORDER)) == FALSE)
        return FALSE;
    //1次元配列にコピーする
    foreach ($arr as $key=>$val)    $urls[$key] = $arr[$key][2];
    return $n;
}

//メイン処理
$str = file_get_contents(★ソースファイル名);
$arr = array();
get_url($str, $arr);

print_r($arr);
?>
id:sakata0819

ありがとうございました、とても参考になりました。

2009/04/30 06:16:33
id:y-kawaz No.3

y-kawaz回答回数1420ベストアンサー獲得回数2252009/04/26 12:30:14ここでベストアンサー

ポイント100pt

そんなに大した話でもなく正規表現で一発かと。

<?php
$html = '<html><head></head><body>
<a href="./test/index.html">リン<span>ク</span>先1</a>
<a href="../test/index2.html">リンク先2</a><a href="/test.index3.html">リンク先3</a>
</bod>
</html>';

function get_link_texts($html) {
    if(preg_match_all('/<a(?:\s[^>]*)?>(.*?)(?=<\/a\s*>)/i', $html, $m)) {
        return array_map("strip_tags", $m[1]);
    }
}

print_r(get_link_texts($html));
?>

strip_tagsはaタグ内のタグを除いたテキストのみが欲しいんじゃないかと思ったので足しておきました。

id:sakata0819

ありがとうございました、最も参考になりました。

2009/04/30 06:16:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません