こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

[php][正規表現]タグ以外を削除したい

いつもお世話になっております。

PHP環境にて、ある文字列において、preg_replaceなどを使い正規表現を用いてタグ以外を削除したい場合、どのように記述すれば宜しいのでしょうか。
例えば、
―――――――――――――――――
これは画像です。<img src="http://example.com/img/example.jpg">
これはテキストリンクです。<a href="http://example.com">exampleへのリンク</a>
これは画像リンクです。<a href="http://example.com"><img src="http://example.com/img/example.jpg"></a>
これはYoutubeの埋め込み動画です。<iframe width="420" height="315" src="http://www.youtube.com/embed/EXAMPLE" frameborder="0" allowfullscreen></iframe>
―――――――――――――――――
このような記述があった場合、imgタグ、aタグ、Youtube以外のすべての通常テキストを削除したいのです。

↓タグ以外のテキスト削除後↓
―――――――――――――――――
<img src="http://example.com/img/example.jpg">
<a href="http://example.com">exampleへのリンク</a>
<a href="http://example.com"><img src="http://example.com/img/example.jpg"></a>
<iframe width="420" height="315" src="http://www.youtube.com/embed/EXAMPLE" frameborder="0" allowfullscreen></iframe>
―――――――――――――――――

最初<このカッコ>に囲まれているもの以外を削除しようと思ったのですが、そうするとaタグの間のテキスト(「exampleへのリンク」の部分)も一緒に削除されてしまいました。
こちらを実現するにはどのように行えば良いか、アドバイスいただけますと嬉しいです。
宜しくお願い致します。

投稿日時 - 2013-01-25 11:24:57

QNo.7909886

困ってます

質問者が選んだベストアンサー

マッチするところ以外を削除するなら、マッチしたものをつなげるのが
手早いかもしれません

<?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";
?>

投稿日時 - 2013-01-25 20:03:25

お礼

教えていただいた内容で試した所
まさに望んだ内容で表示されました。
ありがとうございました!

投稿日時 - 2013-01-29 12:22:01

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

ちょっと面倒な命題ですが

htmlタグやbodyタグで囲まれてたら、全部残っちゃうのでは?
という素朴な疑問もあります。
もし1行ごとに評価してよいならこんなのでも

$pattern='/.*?(<.*>).*$/m';
$replacement='$1';
$html=preg_replace($pattern,$replacement,$html);

投稿日時 - 2013-01-25 14:31:33

補足

ありがとうございます。
確かにhtmlやbodyタグがあると全部残ってしまうのですが、今回はそのような事はございません。
上記の例が、一行(改行なし)になっている前提で、全文を対象に一度に削除出来る方法を教えて頂けますと嬉しいです。

投稿日時 - 2013-01-25 18:30:21

あなたにオススメの質問