Как я могу кодировать строку для HTML? - PullRequest
20 голосов
/ 21 января 2010

Я ищу простой способ HTML-кодирования строки / объекта в Perl. Чем меньше дополнительных пакетов используется, тем лучше.

Ответы [ 3 ]

30 голосов
/ 21 января 2010

HTML :: Entities ваш друг здесь.

use HTML::Entities;
my $encoded = encode_entities( "foo & bar & <baz>" );
27 голосов
/ 11 февраля 2013

Когда на этот вопрос впервые ответили, 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 .

4 голосов
/ 21 января 2010

Что нужно кодировать, строку или объект? Если это просто строка, то вам просто нужно беспокоиться о таких проблемах кодирования, как UTF-8, и CGI :: escape , вероятно, подойдет вам. Если это объект, вам нужно сначала его сериализовать, что открывает целый ряд новых проблем, но вы можете рассмотреть возможность его кодирования JSON .

PS. Хотя, поскольку я не могу найти какую-либо недавнюю документацию по этому методу (он фактически импортирован из CGI :: Util и помечен как «внутренний»), вам, вероятно, следует использовать escapeHTML (), как указывает daxim в его комментарий: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

...