- ベストアンサー
被リンクの一覧を抜き出す正規表現の分かり方
- 被リンクの一覧を抜き出すための正規表現の書き方が分からない方へ
- 特定のページにアクセスして被リンクの一覧を表示するPHPを作成していますが、正規表現のパターンが分からない場合は以下の方法が参考になります
- preg_match_all関数を使用し、所望のパターンにマッチする部分を抜き出すことができます。具体的な正規表現パターンについては、ドキュメンテーションやチュートリアルを参照してください
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
説明を入れておけばよかったですね。 preg_match_allでは正規表現に()を入れておくとそこに該当する部分も一緒に取得できます。 "/<a .*?>(.*?)<\/a>/i"ですので何とかにあたるのは(.*?)の部分です。 $result[0]に正規表現全体に該当する部分(ここでは<a href=...>なんとか</a>)が $relust[1]に(.*?)にあたる部分が抜き出されます。 ですので欲しい部分はすでに取り出されております。 その後の foreach($result[1] as $obj){ echo '<tr><td>'.htmlspecialchars($obj).'</td></tr>'; } で、$result[1]をforeachでまわしているので被リンクが出力されているわけです。 ちなみに()の数を増やすとその分だけ$resultにセットされます。 例) <a href=http://c.oshiete/>なんとか1</a> <a href=http://goo.com/>なんとか2</a> に対して$match="/<a href=(.*?)/>(.*?)(<\/a>)/i"という感じでマッチングすると $result[0][0]=<a href=http://c.oshiete/>なんとか1</a> $result[0][1]=<a href=http://goo.com/>なんとか2</a> $result[1][0]=http://c.oshiete $result[1][1]=http://goo.com $result[2][0]=なんとか1 $result[2][1]=なんとか2 $result[3][0]=</a> $result[3][1]=</a> となります。
その他の回答 (1)
- duron
- ベストアンサー率77% (73/94)
タグの閉じ忘れ等を考慮しないのでよければ↓のような感じで <?php // $fname=htmlspecialchars($_POST['word']); $fname=htmlspecialchars("http://www.yahoo.co.jp/"); $file1=@fopen($fname,'r') or exit('アクセスが出来ませんでした。'); $data=''; while(feof($file1)==false){ $data.=fgets($file1); } $match="/<a .*?>(.*?)<\/a>/i"; preg_match_all($match,$data,$result); if(count($result[0])==0) exit('URLは含まれていません'); echo ('<table border=1>'); echo ('<tr><th>'.$fname.'に含まれるURL</th></tr>'); foreach($result[1] as $obj){ echo '<tr><td>'.htmlspecialchars($obj).'</td></tr>'; } echo '</table>'; ?>
お礼
お返事を頂きありがとうございます。 無事に被リンクのみが表示できました。 できたら、「なんとか1」や「なんとか2」のみを取り出したいのですが、 正規表現では難しいでしょうか? 取り出したあとに、replaceを使って<a>タグを消去する方法に なるのでしょうか?? foreach($result[0] as $obj){ $obj2=preg_replace('/<a.*?>/i','',$obj); $obj3=preg_replace('/<\/a>/','',$obj2); echo '<tr><td>'.htmlspecialchars($obj3).'</td></tr>'; } できましたら、こちらにもご回答を頂けると助かります。 宜しくお願い致します。m(_ _)m
お礼
お返事を頂きありがとうございます。 なんとか1やなんとか2のみを、無事取り出すことができました。 duronさん、ありがとうございました。