Perlで文字列/オブジェクトをHTMLエンコードする簡単な方法を探しています。使用する追加パッケージが少ないほど良いです。
HTML :: Entities はここにいるあなたの友達です。
use HTML::Entities;
my $encoded = encode_entities( "foo & bar & <baz>" );
この質問に最初に回答したとき、 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 。
文字列とオブジェクトのどちらをエンコードする必要がありますか?文字列だけの場合は、UTF-8などのエンコーディングの問題について心配する必要があります。 CGI :: escape でうまくいくでしょう。オブジェクトの場合は、最初にシリアル化する必要があります。これにより、まったく新しい問題が発生しますが、 [〜#〜] json [〜#〜] -encodingを検討することをお勧めします。それ。
PS。このメソッドに関する最近のドキュメントが見つからないため(実際には CGI :: Util からインポートされ、「内部」としてマークされています)、daximが指摘しているようにおそらくescapeHTML()を使用する必要があります。彼のコメント: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML