2008-12-18 4 views
18

CGI.escapeHTML est assez mauvais, mais CGI.unescapeHTML est complètement borked. Par exemple:Existe-t-il un meilleur outil d'échappement et de suppression de l'échappement HTML que CGI pour Ruby?

require 'cgi' 

CGI.unescapeHTML('…') 
# => "…"     # correct - an ellipsis 

CGI.unescapeHTML('…') 
# => "…"    # should be "…" 

CGI.unescapeHTML('¢') 
# => "\242"     # correct - a cent 

CGI.unescapeHTML('¢') 
# => "¢"    # should be "\242" 

CGI.escapeHTML("…") 
# => "…"     # should be "…" 

Il semble que unescapeHTML connaît tous les codes numériques, plus &, <, > et ". Et escapeHTML ne sait que sur ces quatre derniers - il ne fait aucun des codes numériques. Je comprends que l'échappement n'a généralement pas besoin d'être aussi robuste puisque HTML autorisera les versions littérales de la plupart des caractères à l'exception des quatre que connaît CGI.escapeHTML. Mais décourager devrait vraiment être meilleur.

Y at-il un meilleur outil là-bas, au moins pour l'échappement?

+0

Il ne gère pas — non plus. – Chloe

Répondre

26

Le joyau HtmlEntities devrait faire l'affaire:

require 'rubygems' 
require 'htmlentities' 

coder = HTMLEntities.new 

coder.decode('…') # => "…" 
coder.decode('…') # => "…" 
coder.decode('¢') # => "¢" 
coder.decode('¢') # => "¢" 
coder.encode("…", :named) # => "…" 
coder.encode("…", :decimal) # => "…" 
2
require 'rubygems' 
require 'hpricot' 

Hpricot('…', :xhtml_strict => true).to_plain_text 

Bien que vous deviez jouer avec le codage de caractères.

+5

Utilisez la gemme htmlentities plutôt que hpricot. –

Questions connexes