正则表达式匹配所有HTML标签,除了和
发布时间:2020-12-14 06:34:28 所属栏目:百科 来源:网络整理
导读:我需要使用Perl中的正则表达式来匹配和删除所有标签。我有以下几点: ??(?!p).+? 但这仍然与关闭 / p标签。任何关于如何匹配结束标签的提示? 注意,这是在xhtml上执行的。 如果您坚持使用正则表达式,大多数情况下都可以使用这样的方法: # Remove all HT
我需要使用Perl中的正则表达式来匹配和删除所有标签。我有以下几点:
<??(?!p).+?> 但这仍然与关闭< / p>标签。任何关于如何匹配结束标签的提示? 注意,这是在xhtml上执行的。
如果您坚持使用正则表达式,大多数情况下都可以使用这样的方法:
# 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的后端)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |