2008-12-18 7 views
18

CGI.escapeHTML jest dość źle, ale CGI.unescapeHTML jest całkowicie zdewastowany. Na przykład:Czy jest lepsze narzędzie do przechwytywania i usuwania HTML niż CGI dla 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 "…" 

Wydaje się, że unescapeHTML wie o wszystkich kodów numerycznych oraz &, <, > i ". A escapeHTML zna tylko te ostatnie cztery - nie wykonuje żadnego z kodów numerycznych. Rozumiem, że generowanie poleceń generalnie nie musi być tak solidne, ponieważ HTML zezwala na dosłowne wersje większości znaków poza tymi czterema, o których wie, że są one znane. Ale zejście na prostą powinno być naprawdę lepsze.

Czy istnieje lepsze narzędzie, przynajmniej do tego, aby je usunąć?

+0

To nie obsługuje — albo. – Chloe

Odpowiedz

26

Klejnot htmlentities powinno załatwić sprawę:

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 

Chociaż może zajść potrzeba manipulowania kodowaniem znaków.

+5

Użyj klejnotu htmlentities zamiast hpricot. –