例えば
【サンプルソース】
<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"
宜しくお願いします。
そんなに大した話でもなく正規表現で一発かと。
<?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タグ内のタグを除いたテキストのみが欲しいんじゃないかと思ったので足しておきました。
こちらを参考にこんな感じでいかがでしょうか?
$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箇所アンカータグがあると、誤動作してしまいます。
今のところこれが限界です。
申し訳ありません。
ありがとうございました、参考になりました。
以下にソースを示します。
抽出したいリンク文字列のパターンは $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); ?>
ありがとうございました、とても参考になりました。
そんなに大した話でもなく正規表現で一発かと。
<?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タグ内のタグを除いたテキストのみが欲しいんじゃないかと思ったので足しておきました。
ありがとうございました、最も参考になりました。
ありがとうございました、最も参考になりました。