2010-01-20 7 views
19

Je suis à la recherche d'un moyen simple de coder en HTML une chaîne/un objet en Perl. Le moins de paquets supplémentaires utilisés le mieux.Comment puis-je encoder une chaîne pour HTML?

+2

Que voulez-vous dire par "encodage HTML"? Pouvez-vous donner un exemple d'entrée et la sortie désirée? – cjm

+1

Quels jeux de caractères/locales devez-vous gérer? – pilcrow

Répondre

29

HTML::Entities est votre ami.

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

De quel code devez-vous encoder, une chaîne ou un objet? Si c'est juste une chaîne, alors vous devriez juste vous soucier des problèmes d'encodage tels que UTF-8, et CGI::escape fera probablement l'affaire pour vous. Si c'est un objet, vous devrez le sérialiser en premier, ce qui ouvre un nouvel ensemble de problèmes, mais vous pouvez envisager de le coder en JSON.

PS. Bien que je ne trouve aucune documentation récente sur cette méthode (elle est importée de CGI::Util et est marquée comme "interne"), vous devriez probablement utiliser escapeHTML() comme le signale daxim dans son commentaire: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML

+1

La fonction s'appelle 'escapeHTML'. Correct profond: http://search.cpan.org/perldoc?CGI#AUTOESCAPING_HTML – daxim

+0

@daxim: 'CGI :: escape' existe beaucoup; c'est en fait défini dans CGI :: Util et importé dans CGI proprement dit. Si vous regardez la source, il y a quelques différences subtiles dans la mise en œuvre, qui malheureusement ne sont pas bien décrites dans la documentation. – Ether

+0

Très bien. Je ne suis pas capable d'annuler le vote parce que c'est trop vieux. – daxim

27

question a été la première réponse, HTML::Entities était le module la plupart des personnes probablement utilisées. C'est pur Perl et par défaut va échapper les caractères réservés HTML ><'"& et les caractères larges.

Récemment, HTML::Escape est apparu. Il a à la fois XS et Perl pur. Si vous utilisez la version XS, il est environ dix fois plus rapide que HTML::Entities. Cependant, il échappe seulement ><'"& et n'a aucun moyen de changer les valeurs par défaut. Voici la différence avec la version 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) 

Et voici la lutte juste avec les versions pures Perl sur chaque côté:

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) 

Vous pouvez obtenir ces points de repère dans Surveyor::Benchmark::HTMLEntities. J'explique how I distribute benchmarks en utilisant Surveyor::App.

+0

Étant donné que 'HTML :: Entities' recherche aussi des caractères larges, le combat pur de Perl n'est peut-être pas si juste. Il pourrait être intéressant de modifier le code dans la version pure de Perl de 'HTML :: Escape' pour inclure les mêmes cas sous son propre algorithme et voir ce combat à nouveau. –

Questions connexes