如果您坚持使用正则表达式,大多数情况下都可以使用这样的方法:
# Remove all HTML except "p" tags $html =~ s{<(?>/?)(?:[^pP]|[pP][^\s>/])[^>]*>}{}g;
说明:
s{ < # opening angled bracket (?>/?) # ratchet past optional / (?: [^pP] # non-p tag | # ...or... [pP][^\s>/] # longer tag that begins with p (e.g.,<pre>) ) [^>]* # everything until closing angled bracket > # closing angled bracket }{}gx; # replace with nothing,globally
但是真的,保存自己一些头痛,并使用解析器。 CPAN有几个适合的模块。以下是使用功能非常强大的HTML::Parser CPAN发行版HTML::TokeParser模块的示例:
use strict; use HTML::TokeParser; my $parser = HTML::TokeParser->new('/some/file.html') or die "Could not open /some/file.html - $!"; while(my $t = $parser->get_token) { # Skip start or end tags that are not "p" tags next if(($t->[0] eq 'S' || $t->[0] eq 'E') && lc $t->[1] ne 'p'); # Print everything else normally (see HTML::TokeParser docs for explanation) if($t->[0] eq 'T') { print $t->[1]; } else { print $t->[-1]; } }
HTML::Parser以文件名,打开文件句柄或字符串的形式接受输入。将上述代码包装在库中,使目的地可配置(即不仅如上所述打印)并不难。结果将比使用正则表达式更可靠,可维护,也可能更快(HTML :: Parser使用基于C的后端)。