我正在寻找一种在 Perl 中对字符串/对象进行 HTML 编码的简单方法。使用的附加包越少越好。
3 回答
HTML::Entity是你的朋友。
use HTML::Entities;
my $encoded = encode_entities( "foo & bar & <baz>" );
当第一次回答这个问题时,HTML::Entities是大多数人可能使用的模块。它是纯 Perl,默认情况下会转义 HTML 保留字符><'"&
和宽字符。
最近,HTML::Escape出现了。它既有 XS 又有纯 Perl。如果你使用 XS 版本,它比HTML::Entities快十倍左右。但是,它只会转义><'"&
,无法更改默认值。以下是与 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导入并标记为“内部”),但您可能应该使用 escapeHTML() 正如 daxim 在他的评论中指出的那样:http:// search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML