dポイントプレゼントキャンペーン実施中!

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

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へのリンク」の部分)も一緒に削除されてしまいました。
こちらを実現するにはどのように行えば良いか、アドバイスいただけますと嬉しいです。
宜しくお願い致します。

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";
?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/29 12:22

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



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

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

この回答への補足

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

補足日時:2013/01/25 18:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!