Я намагаюся розшифрувати деякі 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 %>