web-dev-qa-db-fra.com

Comment HTML encoder / échapper une chaîne? Y a-t-il un construit?

J'ai une chaîne non approuvée que je veux afficher sous forme de texte dans une page HTML. J'ai besoin d'échapper aux caractères '<' Et '&' En tant qu'entités HTML. Le moins de problèmes le mieux.

J'utilise UTF8 et je n'ai pas besoin d'autres entités pour les lettres accentuées.

Existe-t-il une fonction intégrée dans Ruby ou Rails, ou dois-je lancer la mienne?

92
kch

La méthode d'assistance h:

<%=h "<p> will be preserved" %>
88
Trevor Bramble

Commander la classe Ruby CGI ]. Il existe des méthodes pour coder et décoder le HTML ainsi que les URL.

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
136

Dans Ruby sur Rails 3 HTML sera échappé par défaut).

Pour les chaînes non échappées, utilisez:

<%= raw "<p>hello world!</p>" %>
75
RSK

ERB :: Util.html_escape peut être utilisé n’importe où. Il est disponible sans utiliser require dans Rails.

25
Viktor Trón

Un ajout à la réponse de Christopher Bradford pour utiliser le code HTML d'échappement n'importe où, puisque la plupart des gens n'utilisent pas CGI de nos jours, vous pouvez également utiliser Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
15
J-_-L

Vous pouvez utiliser h() ou html_escape(), mais la plupart des gens utilisent h() par convention. h() est l'abréviation de html_escape() dans Rails.

Dans votre contrôleur:

@stuff = "<b>Hello World!</b>"

A votre avis:

<%=h @stuff %>

Si vous affichez la source HTML: vous verrez la sortie sans mettre les données en gras. C'est à dire. il est codé comme &lt;b&gt;Hello World!&lt;/b&gt;.

Il apparaîtra et sera affiché comme <b>Hello World!</b>

13
Brian R. Bondy

Comparaison des différentes méthodes:

> CGI::escapeHTML("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

> Rack::Utils.escape_html("quote ' double quotes \"")
=> "quote &#x27; double quotes &quot;"

> ERB::Util.html_escape("quote ' double quotes \"")
=> "quote &#39; double quotes &quot;"

J'ai écrit moi-même pour être compatible avec Rails ActionMailer d'échappement:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end
9
Dorian

h() est également utile pour échapper des guillemets.

Par exemple, j'ai une vue qui génère un lien à l'aide d'un champ de texte result[r].thtitle. Le texte pourrait inclure des guillemets simples. Si je ne m'échappais pas result[r].thtitle dans la méthode de confirmation, le Javascript se briserait:

&lt;%= 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 %>

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a>

Noter la :html déclaration de titre échappe comme par magie à Rails.

0
Noddinoff