Tôi đang cố gắng giải mã một số thực thể HTML, chẳng hạn như '<'
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!"
HTMLEntities
viên ngọc giao dịch với những trường hợp như å
và —
đó CGI.unescapeHTML
khô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ó h
phươ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.escapeHTML
có 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 Nokogiri
là một lựa chọn tốt.
CGI::escapeHTML
khô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>
#raw
khô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_safe
mộ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 %>