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

J’ai une chaîne non fiable que je souhaite afficher sous forme de texte dans une page HTML. Je dois échapper aux caractères ‘ < ‘ et ‘ & ‘ en tant qu’entités HTML. Le moins de bruit 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 devrais-je utiliser le mien?

La méthode d’assistance h :

 <%=h "

will be preserved" %>

Vérifiez la classe CGI Ruby. Il existe des méthodes pour encoder et décoder le code HTML ainsi que les URL.

 CGI::escapeHTML('Usage: foo "bar" ') # => "Usage: foo "bar" <baz>" 

Dans Ruby on Rails 3, HTML sera échappé par défaut.

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

 <%= raw "

hello world!

" %>

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

Un ajout à la réponse de Christopher Bradford à l’utilisation du code HTML s’échappant de n’importe où, puisque la plupart des gens n’utilisent pas CGI nos jours, vous pouvez également utiliser Rack :

 require 'rack/utils' Rack::Utils.escape_html('Usage: foo "bar" ') 

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

Dans votre contrôleur:

 @stuff = "Hello World!" 

A votre avis:

 <%=h @stuff %> 

Si vous visualisez la source HTML: vous verrez la sortie sans en gras les données. C’est-à-dire qu’il est encodé sous la forme <b>Hello World!</b> .

Il apparaîtra être affiché comme Hello World!

Comparaison des différentes méthodes:

 > 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 "" 

J’ai écrit le mien pour être compatible avec Rails ActiveMailer échappant:

 def escape_html(str) CGI.escapeHTML(str).gsub("'", "'") end 

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

Par exemple, j’ai une vue qui génère un lien en utilisant un result[r].thtitle champ de texte result[r].thtitle . Le texte peut inclure des guillemets simples. Si je n’échappais pas à result[r].thtitle dans la méthode de confirmation, le Javascript serait rompu:

 <%= 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' 

Remarque: la déclaration de titre :html est échappée par magie par Rails.