- ベストアンサー
[PHP正規表現]タグ以外のテキストを削除する方法
- PHP環境で、正規表現を使ってタグ以外のテキストを削除する方法を教えてください。
- タグ以外のテキストを削除したい場合、preg_replaceなどの関数を使用して正規表現を記述します。
- ただし、< >で囲まれたテキストを削除すると、aタグの間のテキストも削除されてしまいます。どのようにすれば、aタグの間のテキストを残しつつ、タグ以外のテキストを削除できるでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
マッチするところ以外を削除するなら、マッチしたものをつなげるのが 手早いかもしれません <?PHP $html=<<<eof test<img src="1.jpg">test<img src="2.jpg">test test<a href="3.htm">test</a>test test<a href="4.htm"><img src="5.jpg"></a>test test<a href="6.htm">test<img src="7.jpg">test</a>test<img src="8.jpg">test test<a href="9.htm"><img src="10.jpg"><img src="11.jpg">test<img src="12.jpg"></a>test test<iframe src="13.htm" ></iframe>test eof; print "<pre>\n"; print htmlspecialchars($html); print "<hr>\n"; //実作業 ここから $pattern='/<(a|iframe) .*?>.*?<\/\\1>|<img .*?>/mis'; preg_match_all($pattern,$html,$m); $html=implode("\n",$m[0]); //ここまで print htmlspecialchars($html); print "</pre>\n"; ?>
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
ちょっと面倒な命題ですが htmlタグやbodyタグで囲まれてたら、全部残っちゃうのでは? という素朴な疑問もあります。 もし1行ごとに評価してよいならこんなのでも $pattern='/.*?(<.*>).*$/m'; $replacement='$1'; $html=preg_replace($pattern,$replacement,$html);
補足
ありがとうございます。 確かにhtmlやbodyタグがあると全部残ってしまうのですが、今回はそのような事はございません。 上記の例が、一行(改行なし)になっている前提で、全文を対象に一度に削除出来る方法を教えて頂けますと嬉しいです。
お礼
教えていただいた内容で試した所 まさに望んだ内容で表示されました。 ありがとうございました!