Como codificar HTML / escapar de uma corda? Existe um built-in?
-
22-08-2019 - |
Pergunta
Eu tenho uma string não confiável que eu quero mostrar como texto em uma página HTML. Eu preciso para escapar dos caracteres '<
' e '&
' como entidades HTML. A menos barulho, melhor.
Eu estou usando UTF8 e não precisam de outras entidades para letras acentuadas.
Existe um built-in função em Ruby ou Rails, ou devo fazer a minha própria?
Solução
O método h
helper:
<%=h "<p> will be preserved" %>
Outras dicas
classe Caixa Ruby CGI . Existem métodos para codificar e decodificar HTML, bem como URLs.
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
Em Ruby on Rails 3 HTML será escapou por padrão.
Para strings não escapou usar:
<%= raw "<p>hello world!</p>" %>
ERB :: Util.html_escape pode ser em qualquer lugar usado. Ele está disponível sem usar require
em Rails.
Uma adição à resposta de Christopher Bradford usar o HTML escapando em qualquer lugar,
já que a maioria das pessoas não usam CGI
hoje em dia, você também pode usar Rack
:
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
Você pode usar h()
ou html_escape()
, mas a maioria das pessoas usam h()
por convenção. h()
é curto para html_escape()
em trilhos.
Em seu controlador:
@stuff = "<b>Hello World!</b>"
Na sua opinião:
<%=h @stuff %>
Se você exibir a fonte HTML: você verá a saída sem realmente negrito os dados. Ou seja, é codificado como <b>Hello World!</b>
.
Ele aparecerá um ser exibido como <b>Hello World!</b>
comparaison dos diferentes métodos:
> CGI::escapeHTML("quote ' double quotes \"")
=> "quote ' double quotes ""
> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote ' double quotes ""
> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote ' double quotes ""
Eu escrevi o meu próprio para ser compatível com Rails ActiveMailer escapar:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
também é útil para escapar aspas.
Por exemplo, eu tenho uma visão que gera um link usando um result[r].thtitle
campo de texto. O texto poderia incluir aspas simples. Se eu não escapou result[r].thtitle
no método de confirmação, iria quebrar o Javascript:
<%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource,
:action =>:delete_resourced,
:id => result[r].id,
:th => thread,
:html =>{:title=> "<= Remove"},
:confirm => h("#{result[r].thtitle} will be removed"),
:method => :delete %>
<a href="#" onclick="if (confirm('docs: add column &apos;dummy&apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="<= Remove">docs: add column 'dummy'</a>
Nota:. A declaração de título :html
é magicamente escapou pelo Rails