如何使用Perl在字符串中删除HTML?

时间:2009-07-01 05:28:13

标签: html regex perl strip

使用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剥离?

3 个答案:

答案 0 :(得分:21)

假设代码是有效的HTML(没有流浪&lt;或&gt;运算符)

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

如果你只需要删除粗体,h1和br的

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

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

答案 1 :(得分:14)

来自perlfaq9: How do I remove HTML from a string?


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

许多人尝试使用简单的正则表达式方法,例如s /&lt;。*?&gt; // g,但在许多情况下失败,因为标签可能会在换行符上继续,它们可能包含带引号的尖括号或者可能存在HTML评论。此外,人们忘记转换实体 - 比如&lt;例如。

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

#!/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>
-->

答案 2 :(得分: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,因为it breaks utf8 encoding