修正乙の後でアレなんだけど、実際に動かしてみたらだいぶおかしいから手直ししてみたよ、と。

while ($html =~ /
<(NOBR|CODE|B|PRE|FONT)\b

(?=
(
(?:(?!<\/\1>).)*?
(?:<\1\b|$)
)
)
/sixg

) {
print "<".$1.$2, "\n";
}

------------- perl.htm -------------
<b><font><pre><b>aaa
------------- perl.htm -------------

*? はなるべく使いたくないなぁ・・ [^<]*+ を使って最適化したいw