正则表达式匹配所有HTML标签,除了和

我需要使用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的后端)。

http://stackoverflow.com/questions/29869/regex-to-match-all-html-tags-except-p-and-p

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:正则表达式匹配所有HTML标签,除了和