Tôi đang cố gắng giải mã một số thực thể HTML, chẳng hạn như '&lt;'trở thành '<'.
Tôi có một viên ngọc cũ ( html_helpers ) nhưng dường như nó đã bị bỏ rơi hai lần.
Có khuyến nghị nào không? Tôi sẽ cần phải sử dụng nó trong một mô hình.
Tôi đang cố gắng giải mã một số thực thể HTML, chẳng hạn như '&lt;'trở thành '<'.
Tôi có một viên ngọc cũ ( html_helpers ) nhưng dường như nó đã bị bỏ rơi hai lần.
Có khuyến nghị nào không? Tôi sẽ cần phải sử dụng nó trong một mô hình.
Câu trả lời:
HTMLEntities có thể làm điều đó:
: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana; irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "¡I'm highly annoyed with character references!"
=> "¡I'm highly annoyed with character references!"
HTMLEntitiesviên ngọc giao dịch với những trường hợp như åvà —đó CGI.unescapeHTMLkhông.
Để mã hóa các ký tự, bạn có thể sử dụng CGI.escapeHTML:
string = CGI.escapeHTML('test "escaping" <characters>')
Để giải mã chúng, có CGI.unescapeHTML:
CGI.unescapeHTML("test "unescaping" <characters>")
Tất nhiên, trước đó bạn cần bao gồm thư viện CGI:
require 'cgi'
Và nếu bạn đang ở trong Rails, bạn không cần sử dụng CGI để mã hóa chuỗi. Có hphương pháp.
<%= h 'escaping <html>' %>
Tôi nghĩ đá quý Nokogiri cũng là một lựa chọn tốt. Nó rất ổn định và có một cộng đồng đóng góp rất lớn.
Mẫu:
a = Nokogiri::HTML.parse "foo bär"
a.text
=> "foo bär"
hoặc là
a = Nokogiri::HTML.parse "¡I'm highly annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"
CGI.escapeHTMLcó thể không thể giải quyết một số trường hợp. Mặt khác, nếu bạn cần một bộ hỗ trợ đầy đủ, tôi chắc chắn Nokogirilà một lựa chọn tốt.
CGI::escapeHTMLkhông thoát khỏi các ký tự tiếng Đức như äöüß, và có thể hơn ... Với Nokogiri tôi chưa kiểm tra, nhưng đây sẽ là một điểm cộng.
Để giải mã các ký tự trong Rails, hãy sử dụng:
<%= raw '<html>' %>
Vì thế,
<%= raw '<br>' %>
sẽ xuất
<br>
#rawkhông giải mã bất cứ điều gì. Nó cho biết khung nhìn không mã hóa chuỗi. Nó thực hiện điều này bằng cách gói chuỗi trong a ActiveSupport::SafeBuffer, lần lượt có cờ ( html_safe?), được đặt thành true. Khung nhìn sử dụng cờ này để xác định rằng chuỗi có thể được chèn trực tiếp vào HTML mà không bị thoát. Tôi muốn nghĩ về html_safemột chỉ dẫn của lập trình viên rằng chuỗi trong câu hỏi đã được thoát đúng.
Nếu bạn không muốn thêm một phụ thuộc mới chỉ để làm điều này (như HTMLEntities) và bạn đã sử dụng Hpricot, nó có thể thoát và không hiển thị cho bạn. Nó xử lý nhiều hơn CGI:
Hpricot.uxs "foo bär"
=> "foo bär"
<% str="<h1> Test </h1>" %>
result: < h1 > Test < /h1 >
<%= CGI.unescapeHTML(str).html_safe %>