【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/30 06:18:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.3

回答回数1422ベストアンサー獲得回数226

ポイント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ベストアンサー獲得回数2

ポイント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

回答回数5960ベストアンサー獲得回数633

ポイント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

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント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

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

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

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

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

回答リクエストを送信したユーザーはいません