如何HTML编码/转义字符串?有内置的吗?

时间:2009-03-28 15:12:27

标签: html ruby-on-rails ruby escaping encode

我有一个不受信任的字符串,我想在HTML页面中显示为文本。我需要将字符'<'和'&'作为HTML实体转义。越少越好。

我正在使用UTF8,并且不需要其他实体来添加重音字母。

Ruby或Rails中是否有内置函数,或者我应该自己编写?

7 个答案:

答案 0 :(得分:133)

签出Ruby CGI类。有一些方法可以编码和解码HTML以及URL。

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

答案 1 :(得分:85)

h辅助方法:

<%=h "<p> will be preserved" %>

答案 2 :(得分:73)

在Ruby on Rails 3中,HTML默认会被转义。

对于非转义字符串,请使用:

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

答案 3 :(得分:25)

ERB::Util.html_escape可以在任何地方使用。它在Rails中不使用require即可使用。

答案 4 :(得分:15)

克里斯托弗·布拉德福德在任何地方使用HTML转义的答案的补充, 由于现在大多数人都不使用CGI,您也可以使用Rack

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

答案 5 :(得分:13)

您可以使用h()html_escape(),但大多数人按惯例使用h()h()是rails中html_escape()的缩写。

在您的控制器中:

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

在您看来:

<%=h @stuff %>

如果您查看HTML源:您将看到输出而不实际加粗数据。即它被编码为&lt;b&gt;Hello World!&lt;/b&gt;

它将显示为<b>Hello World!</b>

答案 6 :(得分:0)

h()对于转义引号也很有用。

例如,我有一个使用文本字段result[r].thtitle生成链接的视图。该文本可能包括单引号。如果我没有在confirm方法中转义result[r].thtitle,那么Javascript就会破坏:

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

注意::html标题声明被Rails神奇地转义。