Perl で文字列/オブジェクトを HTML エンコードする簡単な方法を探しています。使用する追加パッケージが少ないほど良い。
3 に答える
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エンコードを検討することをお勧めします。
PS。このメソッドに関する最近のドキュメントが見つからないため (実際にはCGI::Utilからインポートされ、「内部」としてマークされています)、daxim がコメントで指摘しているように、おそらく escapeHTML() を使用する必要があります: http:// search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML