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 ファイルくらいはちゃんと処理してるのになあ。