実務で使える・使ったjQueryプラグイン5選 [jQuery]日付・時刻のフォーマット・整合性をチェックするプラグインを作ったよ
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% [?]

written by ANN

add to hatena hatena.comment (8) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 8

2 Responses to “[PHP]指定タグの中身をごっそり削除する正規表現”

  1. 通りすがり Says:

    過去の記事だけど、上の正規表現間違ってるよ。
    あとね、HTMLの解析は正規表現でやらない方がいい。例えばSCRIPTタグにしてみても

    <script type=”text/javascript>

     //これ、どうする?
     document.write(’<script>alert(”test”);</script>’);

    </script>

    中途半端なところで切れちゃうでしょ。

  2. 管理者 Says:

    WordPressのエディタのせいで一部コードがヘンなってました。

    通りすがりさん、助言ありがとうございます。

    正規表現でやらないほうが良いと言うことは、別のDOM解析用のライブラリを使ったほうがいいとかそういう感じでしょうか?

    上記の正規表現については、指摘の通り、中途半端なところで切れてしまいますね。
    再度考えてみます。

Leave a Reply