2009-07-01 8 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を必要としていても、ありますか?あなたが唯一の太字、H1年代とBRの

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

を削除する必要があり、あなたが考慮する必要があります場合は、コードを仮定し

答えて

18

は、有効なHTML(無浮遊<または>演算子)

ですHTML::Stripモジュール

+5

私は言いたいことはないと思います。 regexesでHTMLをサニタイズしようとすると、この日と年齢では不合理です。 CPANの多数のHTMLサニタイズモジュールの1つを使用してください。好ましくは、XSSの脆弱性を防止するために設計されたもので、Daniel Muey氏によって作成されたものではありません。 –

+2

HTML :: StripはUTF-8でエンコードされた文字列を正しくサポートしていません。回避策についてはこちらを参照してくださいhttps://gist.github.com/910818 – nick

14

からperlfaq9: How do I remove HTML from a string?


もっとも正しい方法は、CPANのHTML :: Parserを使用することです。もう一つの主な正しい方法は、HTML :: FormatTextを使うことです.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プログラムを参照してください。 HTMLのコメントが他のタグが含まれている場合、これらのソリューションはまた、このようなテキストに破る

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

:ここ

はあなたのソリューションを選ぶ際に考えなければならないいくつかのトリッキーな例です

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

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' 

私はit breaks utf8 encodingので離れHTML ::ストリップから滞在することをお勧めします。

+0

欲しい私は数週間前にこの答えを読んでいました。 – Steven

+0

Perl 5.8.xでは動作しません。それはスーパープログラムですが、そのサポート構造が何であるかを知ることはうれしいでしょう。 – PKHunter

+0

また、オープンタグとクローズタグを持たないタグ(許容タグ)を残す方法があるかどうかはわかりません。例 '
'は識別が困難です。 – PKHunter

関連する問題