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

Par*_*roX 10 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;
Run Code Online (Sandbox Code Playgroud)

我会同时修饰一个精简的正则表达式,例如:

$Error_Msg =~ s|</?[b|h1|br]>||ig;
Run Code Online (Sandbox Code Playgroud)

是否存在从字符串中删除任何/所有HTML的现有Perl函数,即使我只需要粗体,h1标题和br剥离?

Abh*_*pta 21

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

$htmlCode =~ s|<.+?>||g;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我不会说可能,我会说应该.在这个时代,试图用正则表达式来清理HTML是荒谬的.使用CPAN中众多的HTML清理模块之一,最好是设计用于防止XSS漏洞而不是Daniel Muey编写的模块. (6认同)
  • 注意HTML :: Strip不能正确支持UTF-8编码的字符串.请参阅此处获取解决方法https://gist.github.com/910818 (3认同)

bri*_*foy 14

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


最正确的方法(尽管不是最快)是使用CPAN的HTML :: Parser.另一种主要是正确的方法是使用HTML :: FormatText它不仅能消除HTML,但也试图这样做所产生的纯文本的一点点简单的格式.

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

这是一个"简单的"方法,适用于大多数文件:

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

如果您需要更完整的解决方案,请参阅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 [ >>>>>>>>>>>> ]]>
Run Code Online (Sandbox Code Playgroud)

如果HTML注释包含其他标记,那么这些解决方案也会破坏文本,如下所示:

<!-- This section commented out.
    <B>You can't see me!</B>
-->
Run Code Online (Sandbox Code Playgroud)


Jua*_*rro 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'
Run Code Online (Sandbox Code Playgroud)

我建议远离HTML :: Strip,因为它破坏了utf8编码.