2009-07-01 52 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

相關問題