Cómo HTML codificación / escapar de una cadena? ¿Hay un built-in?
-
22-08-2019 - |
Pregunta
Tengo una cadena que no se confía que yo quiero mostrar como texto en una página HTML. Tengo que escapar de los caracteres '<
' y '&
' como entidades HTML. Cuanto menos alboroto, mejor.
Estoy usando UTF-8 y no necesitan otras entidades para las letras acentuadas.
¿Hay una función incorporada en Ruby o Rails, o debería rodar mi propia?
Solución
El método h
helper:
<%=h "<p> will be preserved" %>
Otros consejos
Pedido clase Rubí CGI . Hay métodos para codificar y decodificar HTML así como URLs.
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
En Ruby on Rails 3 HTML se escaparon por defecto.
Para cadenas no utilizan escapado:
<%= raw "<p>hello world!</p>" %>
ERB :: Util.html_escape puede haber utilizado en cualquier lugar. Está disponible sin necesidad de utilizar require
en Rails.
Una adición a la respuesta de Christopher Bradford utilizar el código HTML escapar en cualquier lugar,
ya que la mayoría de la gente no utiliza CGI
hoy en día, también se puede utilizar Rack
:
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
Puede utilizar cualquiera h()
o html_escape()
, pero la mayoría de la gente utilizar h()
por convención. h()
es la abreviatura de html_escape()
en rieles.
En el controlador:
@stuff = "<b>Hello World!</b>"
En su opinión:
<%=h @stuff %>
Si ve el código HTML: verá la salida sin tener que escribir en negrita los datos. Es decir. se codifica como <b>Hello World!</b>
.
aparecerá un mostrará como <b>Hello World!</b>
Comparaison de los 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 ""
escribí mi propia para ser compatible con los carriles ActiveMailer escapar:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
también es útil para escapar comillas.
Por ejemplo, tengo una visión que genera un enlace utilizando una result[r].thtitle
campo de texto. El texto podría incluir comillas simples. Si no escapé result[r].thtitle
en el método de confirmación, el código JavaScript se rompería:
<%= 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:. :html
la declaración del título se escapó mágicamente por los carriles