Estou tentando decodificar algumas entidades HTML, como '<'
tornar-se '<'
.
Eu tenho uma jóia antiga ( html_helpers ), mas parece ter sido abandonada duas vezes.
Alguma recomendação? Vou precisar usá-lo em um modelo.
Estou tentando decodificar algumas entidades HTML, como '&lt;'
tornar-se '<'
.
Eu tenho uma jóia antiga ( html_helpers ), mas parece ter sido abandonada duas vezes.
Alguma recomendação? Vou precisar usá-lo em um modelo.
Respostas:
HTMLEntities pode fazer isso:
: 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
gema lida com casos como å
e —
quais CGI.unescapeHTML
não.
Para codificar os caracteres, você pode usar CGI.escapeHTML
:
string = CGI.escapeHTML('test "escaping" <characters>')
Para decodificá-los, existe CGI.unescapeHTML
:
CGI.unescapeHTML("test "unescaping" <characters>")
Obviamente, antes disso, você precisa incluir a biblioteca CGI:
require 'cgi'
E se você estiver no Rails, não precisará usar CGI para codificar a string. Existe o h
método.
<%= h 'escaping <html>' %>
Eu acho que a jóia Nokogiri também é uma boa escolha. É muito estável e tem uma enorme comunidade contribuinte.
Amostras:
a = Nokogiri::HTML.parse "foo bär"
a.text
=> "foo bär"
ou
a = Nokogiri::HTML.parse "¡I'm highly annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"
CGI.escapeHTML
talvez não consiga resolver alguns casos. Por outro lado, se você precisar de um conjunto completo de suporte, tenho certeza de que Nokogiri
é uma boa escolha.
CGI::escapeHTML
não escapa caracteres alemães como äöüß, e talvez mais ... Com Nokogiri ainda não verifiquei, mas esse seria um ponto positivo.
Para decodificar caracteres no Rails, use:
<%= raw '<html>' %>
Assim,
<%= raw '<br>' %>
produziria
<br>
#raw
não decodifica nada. Diz à exibição para não codificar a sequência. Isso é feito envolvendo a string em a ActiveSupport::SafeBuffer
, que por sua vez possui uma flag ( html_safe?
), definida como true. A visualização usa esse sinalizador para determinar que a cadeia pode ser injetada diretamente no HTML sem ser escapada. Eu gosto de pensar html_safe
como uma indicação do programador de que a string em questão já foi escapada corretamente.
Se você não deseja adicionar uma nova dependência apenas para fazer isso (como HTMLEntities
) e já está usando Hpricot
, ela pode escapar e não escapar para você. Ele lida com muito mais do que CGI
:
Hpricot.uxs "foo bär"
=> "foo bär"
<% str="<h1> Test </h1>" %>
result: < h1 > Test < /h1 >
<%= CGI.unescapeHTML(str).html_safe %>