12

有没有比这更容易使用 Perl 从字符串中去除 HTML 的?

$Error_Msg =~ s|<b>||ig;
$Error_Msg =~ s|</b>||ig;
$Error_Msg =~ s|<h1>||ig;
$Error_Msg =~ s|</h1>||ig;
$Error_Msg =~ s|<br>||ig;

我会欣赏一个精简的正则表达式,例如这样的:

$Error_Msg =~ s|</?[b|h1|br]>||ig;

是否有一个现有的 Perl 函数可以从字符串中删除任何/所有 HTML,即使我只需要删除粗体、h1 标题和 br?

4

3 回答 3

25

假设代码是有效的 HTML(没有杂散的 < 或 > 运算符)

$htmlCode =~ s|<.+?>||g;

如果您只需要删除粗体、h1 和 br

$htmlCode =~ s#</?(?:b|h1|br)\b.*?>##g

您可能需要考虑HTML::Strip模块

于 2009-07-01T05:31:04.453 回答
16

来自perlfaq9:如何从字符串中删除 HTML?


最正确的方法(尽管不是最快的)是使用 CPAN 中的 HTML::Parser。另一种最正确的方法是使用 HTML::FormatText,它不仅会删除 HTML,还会尝试对生成的纯文本进行一些简单的格式化。

许多人尝试使用简单的正则表达式方法,例如 s/<.*?>//g,但在许多情况下都失败了,因为标签可能会在换行符处继续,它们可能包含带引号的尖括号,或者 HTML 注释可能出席。另外,人们忘记转换实体——例如 < 例如。

这是一种适用于大多数文件的“头脑简单”的方法:

#!/usr/bin/perl -p0777
s/<(?:[^>'"]*|(['"]).*?\1)*>//gs

如果您想要更完整的解决方案,请参阅http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz中的 3 阶段 striphtml 程序。

以下是您在选择解决方案时应该考虑的一些棘手案例:

<IMG SRC = "foo.gif" ALT = "A > B">

<IMG SRC = "foo.gif"
 ALT = "A > B">

<!-- <A comment> -->

<script>if (a<b && a>c)</script>

<# Just data #>

<![INCLUDE CDATA [ >>>>>>>>>>>> ]]>

如果 HTML 注释包含其他标签,那么这些解决方案也会中断如下文本:

<!-- This section commented out.
    <B>You can't see me!</B>
-->
于 2009-07-01T08:16:54.577 回答
14

您绝对应该看一下HTML::Restrict,它允许您剥离或限制允许的 HTML 标记。剥离所有 HTML 标记的最小示例:

use HTML::Restrict;

my $hr = HTML::Restrict->new();
my $processed = $hr->process('<b>i am bold</b>'); # returns 'i am bold'

我建议远离 HTML::Strip 因为它破坏了 utf8 encoding

于 2011-03-03T13:09:35.440 回答