2010-01-20 17 views
19

Estoy buscando una forma simple de codificar HTML una cadena/objeto en Perl. Cuantos menos paquetes adicionales se utilicen, mejor.¿Cómo puedo codificar una cadena para HTML?

+2

¿Qué quiere decir exactamente con "codificación HTML"? ¿Puedes dar un ejemplo de entrada y la salida deseada? – cjm

+1

¿Qué conjuntos de caracteres/configuraciones regionales debe manejar? – pilcrow

Respuesta

29

HTML::Entities es tu amigo aquí.

use HTML::Entities; 
my $encoded = encode_entities("foo & bar & <baz>"); 
4

¿Qué necesitas para codificar, una cuerda o un objeto? Si solo se trata de una cadena, entonces solo debe preocuparse por los problemas de codificación como UTF-8 y CGI::escape, probablemente sea el truco para usted. Si es un objeto, primero tendrá que serializarlo, lo que abre un nuevo conjunto de problemas, pero es posible que desee considerar JSON -encoding it.

PS. Aunque como no puedo encontrar documentación reciente sobre este método (en realidad se importó desde CGI::Util y está marcado como "interno"), probablemente deba usar escapeHTML() como daxim en su comentario: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

+1

La función se llama 'escapeHTML'. Enlace interno apropiado: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML – daxim

+0

@daxim: 'CGI :: escape' existe mucho; en realidad está definido en CGI :: Util e importado a CGI propiamente dicho. Si nos fijamos en la fuente, existen algunas diferencias sutiles en la implementación, que lamentablemente no están bien descritas en la documentación. – Ether

+0

De acuerdo. No puedo deshacer la votación porque es demasiado antigua. – daxim

27

Cuando esto La pregunta fue respondida primero, HTML::Entities fue el módulo que la mayoría de la gente probablemente usó. Es puro Perl y, de forma predeterminada, escapará de los caracteres reservados de HTML ><'"& y de los caracteres anchos.

Recientemente, HTML::Escape apareció. Tiene tanto XS como Perl puro. Si está utilizando la versión XS, es aproximadamente diez veces más rápido que HTML::Entities. Sin embargo, solo escapa al ><'"& y no tiene forma de cambiar los valores predeterminados. Esta es la diferencia con la versión 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) 

Y aquí está la lucha justa con las versiones de Perl puros en cada lado:

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) 

puede obtener estos puntos de referencia en Surveyor::Benchmark::HTMLEntities. Explico how I distribute benchmarks usando Surveyor::App.

+0

Dado que 'HTML :: Entities' busca también caracteres anchos, la lucha pura de Perl podría no ser tan justa. Podría ser interesante alterar el código en la versión pura de Perl de 'HTML :: Escape' para incluir los mismos casos bajo su propio algoritmo y ver esa pelea de nuevo. –

Cuestiones relacionadas