簡體   English   中英

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

[英]How can I strip HTML in a string using Perl?

有沒有比這更容易使用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剝離?

假設代碼是有效的HTML(沒有雜散的<或>運算符)

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

如果你只需要刪除粗體,h1和br

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

您可能想要考慮HTML :: Strip模塊

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

您一定要看一下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編碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM