危険なHTMLタグを削除する正規表現

ユーザ入力などから危険なHTMLタグおよび属性などを削除する正規表現
preg_replaceで使用します。


不完全な箇所もあるかもしれないので、ご参考までに。


タグからstyle属性を削除
$pattern = '/style=[\"\']?[^>]*[\"\']?>/si';
$replacement = '>';

もしstyleの後ろに他の属性があったら、それも削除されますが、
 「使わないでください」とお願いしてる環境でそんなもの入れる方が悪い、と割り切りました(笑)

タグからon****属性を削除
$pattern = '/on[\w]+=[\"\']?[^>]*[\"\']?>/si';
$replacement = '>';

もしon****の後ろに他の属性があったら(以下同文)

url(***)設定を削除する
$pattern = '/url\(.*\)/';
$replacement = '';
許可したタグ(WhiteList)のみを[][[]]括りに変換
$pattern = '/<(\/)?'. $tag. '(\s[^>]*)?>/si';
$replacement = '[$1'. $tag. '$2]';

変換結果は以下のようになります。

<font size="2" color="red">ふぉんと</font>
↓
[font size="2" color="red"]ふぉんと[/font]
タグは全部削除
$pattern = '/<[\/\!]*?[^<>]*?>/si';
$replacement = '';


参考サイト。色々な言語向けのHTMLタグをヒットさせる正規表現が掲載されています。
CodeS-SourceS - CCM