web-dev-qa-db-ja.com

HTMLの文字列をエンコードするにはどうすればよいですか?

Perlで文字列/オブジェクトをHTMLエンコードする簡単な方法を探しています。使用する追加パッケージが少ないほど良いです。

20
Phill Pafford

HTML :: Entities はここにいるあなたの友達です。

use HTML::Entities;
my $encoded = encode_entities( "foo & bar & <baz>" );
30
friedo

この質問に最初に回答したとき、 HTML :: Entities はほとんどの人がおそらく使用したモジュールでした。これは純粋なPerlであり、デフォルトではHTMLの予約文字をエスケープします><'"&およびワイド文字。

最近、 HTML :: Escape が表示されました。 XSと純粋なPerlの両方があります。 XSバージョンを使用している場合は、 HTML :: Entities よりも約10倍高速です。ただし、エスケープするだけです><'"&デフォルトを変更する方法はありません。 XSバージョンとの違いは次のとおりです。

Benchmark: timing 10000 iterations of html_entities, html_escape...
html_entities: 14 wallclock secs (14.09 usr +  0.01 sys = 14.10 CPU) @ 709.22/s (n=10000)
html_escape:  1 wallclock secs ( 0.68 usr +  0.00 sys =  0.68 CPU) @ 14705.88/s (n=10000)

そして、これがそれぞれの側で純粋なPerlバージョンとの公正な戦いです:

Benchmark: timing 10000 iterations of html_entities, html_escape...
html_entities: 14 wallclock secs (13.79 usr +  0.01 sys = 13.80 CPU) @ 724.64/s (n=10000)
html_escape:  7 wallclock secs ( 7.57 usr +  0.01 sys =  7.58 CPU) @ 1319.26/s (n=10000)

これらのベンチマークは Surveyor :: Benchmark :: HTMLEntities で取得できます。 ベンチマークの配布方法 を使用して説明します Surveyor :: App

27
brian d foy

文字列とオブジェクトのどちらをエンコードする必要がありますか?文字列だけの場合は、UTF-8などのエンコーディングの問題について心配する必要があります。 CGI :: escape でうまくいくでしょう。オブジェクトの場合は、最初にシリアル化する必要があります。これにより、まったく新しい問題が発生しますが、 [〜#〜] json [〜#〜] -encodingを検討することをお勧めします。それ。

PS。このメソッドに関する最近のドキュメントが見つからないため(実際には CGI :: Util からインポートされ、「内部」としてマークされています)、daximが指摘しているようにおそらくescapeHTML()を使用する必要があります。彼のコメント: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

4
Ether