Я пытаюсь декодировать некоторые объекты HTML, такие как '<'
становление '<'
.
У меня есть старый гем ( html_helpers ), но он, кажется, был заброшен дважды.
Любые рекомендации? Мне нужно будет использовать его в модели.
Я пытаюсь декодировать некоторые объекты HTML, такие как '&lt;'
становление '<'
.
У меня есть старый гем ( html_helpers ), но он, кажется, был заброшен дважды.
Любые рекомендации? Мне нужно будет использовать его в модели.
Ответы:
HTMLEntities может сделать это:
: 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
драгоценный камень имеет дело со случаями, такими как å
и —
который CGI.unescapeHTML
не делает.
Для кодирования символов вы можете использовать CGI.escapeHTML
:
string = CGI.escapeHTML('test "escaping" <characters>')
Для их декодирования есть CGI.unescapeHTML
:
CGI.unescapeHTML("test "unescaping" <characters>")
Конечно, перед этим необходимо включить библиотеку CGI:
require 'cgi'
И если вы в Rails, вам не нужно использовать CGI для кодирования строки. Есть h
метод.
<%= h 'escaping <html>' %>
Я думаю, что камень Nokogiri также хороший выбор. Он очень стабилен и имеет огромное содействующее сообщество.
Образцы:
a = Nokogiri::HTML.parse "foo bär"
a.text
=> "foo bär"
или
a = Nokogiri::HTML.parse "¡I'm highly annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"
CGI.escapeHTML
возможно, не удалось решить некоторые случаи. С другой стороны, если вам нужен полный набор поддержки, я уверен, что Nokogiri
это хороший выбор.
CGI::escapeHTML
не избегает немецких символов, таких как äöüß, а может и больше ... С Nokogiri я еще не проверял, но это было бы плюсом.
Для декодирования символов в Rails используйте:
<%= raw '<html>' %>
Так,
<%= raw '<br>' %>
будет выводить
<br>
#raw
ничего не декодирует Это говорит представлению не кодировать строку. Это делается путем переноса строки в a ActiveSupport::SafeBuffer
, которая в свою очередь имеет флаг ( html_safe?
), установленный в значение true. Представление использует этот флаг, чтобы определить, что строка может быть вставлена непосредственно в HTML без экранирования. Мне нравится воспринимать программиста html_safe
как указание на то, что рассматриваемая строка уже правильно экранирована.
Если вы не хотите добавлять новую зависимость только для того, чтобы сделать это (например HTMLEntities
), и вы уже используете ее Hpricot
, она может как выйти, так и удалиться. Он обрабатывает гораздо больше, чем CGI
:
Hpricot.uxs "foo bär"
=> "foo bär"
<% str="<h1> Test </h1>" %>
result: < h1 > Test < /h1 >
<%= CGI.unescapeHTML(str).html_safe %>