22

我正在寻找一种在 Perl 中对字符串/对象进行 HTML 编码的简单方法。使用的附加包越少越好。

4

3 回答 3

32

HTML::Entity是你的朋友。

use HTML::Entities;
my $encoded = encode_entities( "foo & bar & <baz>" );
于 2010-01-20T21:29:54.707 回答
30

当第一次回答这个问题时,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分发基准。

于 2013-02-11T18:52:02.010 回答
4

您需要对哪个进行编码,一个字符串还是一个对象?如果它只是一个字符串,那么您应该只需要担心编码问题,例如 UTF-8,而CGI::escape可能会为您解决问题。如果它是一个对象,您需要先对其进行序列化,这会引发一系列全新的问题,但您可能需要考虑对其进行JSON编码。

PS。尽管由于我找不到有关此方法的任何最新文档(它实际上是从CGI::Util导入并标记为“内部”),但您可能应该使用 escapeHTML() 正如 daxim 在他的评论中指出的那样:http:// search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

于 2010-01-20T21:30:17.157 回答