Come HTML codifica / sfuggire a una stringa? C'è un built-in?
-
22-08-2019 - |
Domanda
Ho una stringa non attendibile che voglio mostrare come testo in una pagina HTML. Ho bisogno di sfuggire alle caratteri '<
' e '&
' come entità HTML. Il meno fastidi e meglio è.
Sto usando UTF8 e non ho bisogno di altri enti per le lettere accentate.
C'è una funzione built-in in Ruby o Rails, o devo rotolare il mio?
Soluzione
Il metodo h
helper:
<%=h "<p> will be preserved" %>
Altri suggerimenti
CGI classe. Ci sono metodi per codificare e decodificare HTML e gli URL.
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
In Ruby on Rails 3 HTML sarà sfuggito per impostazione predefinita.
Per le stringhe non sfuggito utilizzano:
<%= raw "<p>hello world!</p>" %>
ERB :: Util.html_escape può essere utilizzato ovunque. E 'disponibile senza utilizzare require
in Rails.
Un Oltre alla risposta di Christopher Bradford a utilizzare il codice HTML fuggire da nessuna parte,
dal momento che la maggior parte delle persone non usano CGI
al giorno d'oggi, è anche possibile utilizzare Rack
:
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
È possibile utilizzare uno o h()
html_escape()
, ma la maggior parte delle persone usano h()
per convenzione. h()
è l'abbreviazione di html_escape()
in Rails.
Nel vostro controller:
@stuff = "<b>Hello World!</b>"
Secondo voi:
<%=h @stuff %>
Se si visualizza l'origine HTML: vedrete l'uscita senza grassetto effettivamente i dati. Cioè è codificato come <b>Hello World!</b>
.
Sarà visualizzato un visualizzato come <b>Hello World!</b>
Comparaison dei diversi metodi:
> 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 ""
ho scritto la mia per essere compatibile con Rails ActiveMailer fuga:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
è utile anche per sfuggire citazioni.
Per esempio, ho una visione che genera un collegamento mediante un result[r].thtitle
campo di testo. Il testo potrebbe includere apici. Se io non sfuggì result[r].thtitle
nel metodo di conferma, il Javascript romperebbe:
<%= 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: la dichiarazione del titolo :html
è magicamente sfuggito da Rails