2009-07-01 57 views
8

反正比这更容易使用Perl去除字符串中的HTML吗?如何使用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; 

是否有从一个字符串去掉任何/所有HTML现有的Perl功能,即使我只需要加粗,H1标题和BR剥离?

回答

18

假设代码是有效的HTML(无杂散<或>运营商)

如果您需要删除仅加粗,H1的和Br的

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

你可能要考虑的HTML::Strip模块

+5

我不会说可能,我会说应该。 试图在正确的时代用正则表达式来消除HTML是荒谬的。 使用来自CPAN的许多HTML清理模块之一,最好是防止XSS漏洞的东西,而不是由Daniel Muey编写。 – 2009-07-02 10:52:04

+2

注意HTML :: Strip不能正确支持UTF-8编码的字符串。请参阅此处了解变通办法https://gist.github.com/910818 – nick 2012-08-08 09:12:43

14

perlfaq9: How do I remove HTML from a string?


最正确的方法(尽管不是最快)是使用CPAN的HTML :: Parser。另一种最正确的方法是使用HTML :: FormatText,它不仅可以删除HTML,还可以尝试对生成的纯文本进行一些简单的格式化。许多人尝试一种简单的正则表达式方法,例如s/<。*?> // g,但在许多情况下失败,因为标签可能会在换行符之后继续,它们可能包含带引号的尖括号,或HTML评论可能存在。另外,人们忘记转换实体 - 例如<。

这里有一个“头脑简单”的方法,对于大多数文件的工作原理:

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

如果你想有一个更完整的解决方案,请参阅3级striphtml程序http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz

下面是你应该考虑选择一个解决方案时,一些棘手的情况:

<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> 
--> 
+0

致您的脚本建议 - http://www.cpan.org/authors/id/T/TO/TOMC/scripts/striphtml.gz - 这会删除所有内容。我如何修改这段代码只留下某些html标签?除此之外,它运作良好。 – PKHunter 2015-09-19 11:00:21

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 ::地带望而却步,因为it breaks utf8 encoding

相关问题