7月 29
phpにはstrip_tagsという、タグを取り除く関数があるが、特定のタグに挟まれた部分をごっそり削除したい場合、これは該当しない。PEARを探してみたけど、それっぽいのを発見できず。しょうがないので正規表現で書いてみる。(むしろ備忘録)
具体的にどういう時に使うかというと、PHPからの出力時に、
- <style>~</style>タグの中身を全部削除したい
- <script>~</script>タグの中身を全部削除したい
- コメント用の独自タグを、出力時にタグの中身もろとも削除したい。
などなど。テンプレートHTMLの編集時には必要だけど、最終的な出力時にはいらないタグとか。
また、RSSなど、出力先によっては、本文中に含まれるscriptタグが不要な場合などに。
$str = "
<div>hoge</div>
aaa
<div>bbb</div>
<script type='text/javascript'>
alert('<script>aaaa</script>');
</script>";
echo "\n=== src === \n";
echo $str;
echo "\n=== strip div === \n";
echo strip_between_tag($str,"div");
echo "\n=== strip script === \n";
echo strip_between_tag($str,"script");
function strip_between_tag($str,$tag){
$pattern = sprintf("!<%s.*?>.*?</%s>!ims",$tag,$tag);
$ret = preg_replace($pattern,"",$str);
return $ret;
}
パターン修飾子のimsで、大文字/小文字/改行にも対応。
しかし、正規表現ってややこしいね。パズル的だし。子供にやらせたら知育になるんじゃないだろうか。
※[2010/5/31]にソース修正。まだ、タグの入れ子時にうまく置換できません。参考される場合は時期責任でお願いします。
Popularity: 19% [?]





5月 1st, 2010 at 12:13 PM
過去の記事だけど、上の正規表現間違ってるよ。
あとね、HTMLの解析は正規表現でやらない方がいい。例えばSCRIPTタグにしてみても
<script type=”text/javascript>
//これ、どうする?
document.write(’<script>alert(”test”);</script>’);
</script>
中途半端なところで切れちゃうでしょ。
5月 31st, 2010 at 6:52 PM
WordPressのエディタのせいで一部コードがヘンなってました。
通りすがりさん、助言ありがとうございます。
正規表現でやらないほうが良いと言うことは、別のDOM解析用のライブラリを使ったほうがいいとかそういう感じでしょうか?
上記の正規表現については、指摘の通り、中途半端なところで切れてしまいますね。
再度考えてみます。