HTML から span like なインライン要素タグを正規表現を使って除く修行

Regexp::Common にこういうのはあるのだろうか。と思いつつ HTML から span とその仲間達 (インライン要素タグ) にマッチする正規表現をでっちあげた。

my $SINGLE_QUOTED = qr{\' [^\']* \'}xms;
my $DOUBLE_QUOTED = qr{\" [^\"]* \"}xms;
my $NOT_QUOTED = qr{[^\'\">]+}xms;
my $NAME = qr{ [abiu] | em | tt | big | font | address |
               s (?: trike | pan | trong | amp | mall | u[bp] ) |
               c (?: ite | ode )
          }xmsi;
my $START_TAG = qr{ < $NAME
                    (?: \s+ (?: (?: $SINGLE_QUOTED) |
                                (?: $DOUBLE_QUOTED) |
                                (?: $NOT_QUOTED)        )* )? > }xms;
my $END_TAG   = qr{ </$NAME> }xms;

$html =~ s{ (?: $START_TAG ) | (?: $END_TAG ) }{}xmsg;

タグの名前の正規表現 ($NAME) で i を使っているところが遅そう。

追記

作成中のプログラムにこの処理を加えたらセグメンテーションフォールトで落ちるようになった。うー。なんだろうなあ。テストプログラムではちゃんと動いてるんだけどなあ。1000 ファイルくらいはちゃんと処理してるのになあ。