2008-12-18 33 views
18

CGI.escapeHTML là khá xấu, nhưng CGI.unescapeHTML hoàn toàn bị bẻ khóa. Ví dụ:Có công cụ thoát HTML và unescaping tốt hơn so với CGI cho Ruby không?

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 "…" 

Dường như unescapeHTML biết về tất cả các mã số cộng &, <, >, và ". Và escapeHTML chỉ biết về bốn người cuối cùng - nó không thực hiện bất kỳ mã số nào. Tôi hiểu rằng thoát thường không cần phải mạnh mẽ vì HTML sẽ cho phép các phiên bản chữ của hầu hết các ký tự ngoại trừ bốn ký tự mà CGI.escapeHTML biết. Nhưng unescaping thực sự nên được tốt hơn.

Có công cụ nào tốt hơn không, ít nhất là để không thoát?

+0

Nó không xử lý — một trong hai. – Chloe

Trả lời

26

Các htmlentities đá quý nên làm các trick:

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 

Mặc dù bạn có thể phải loay hoay với mã hóa ký tự.

+5

Sử dụng đá quý htmlentities thay vì hpricot. –

Các vấn đề liên quan