gpt4 book ai didi

html - 正则表达式匹配除

之外的所有 HTML 标签

转载 作者:技术小花猫 更新时间:2023-10-29 11:57:47 26 4
gpt4 key购买 nike

我需要在 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::TokeParser 的示例功能极其强大的模块 HTML::Parser CPAN 分布:

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接受文件名、打开的文件句柄或字符串形式的输入。将上述代码包装在库中并使目标可配置(即,不仅仅是上面的 printing)并不难。与尝试使用正则表达式相比,结果将更可靠、更易于维护,而且可能更快(HTML::Parser 使用基于 C 的后端)。

关于html - 正则表达式匹配除 <p> 和 </p> 之外的所有 HTML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com