加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式匹配所有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的后端)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读