104

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

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

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

4

8 回答 8

147

查看 Ruby CGI类。有一些方法可以对 HTML 和 URL 进行编码和解码。

CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
于 2010-09-30T13:52:33.240 回答
98

h辅助方法:

<%=h "<p> will be preserved" %>
于 2009-03-28T15:14:54.067 回答
78

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

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

<%= raw "<p>hello world!</p>" %>
于 2011-06-08T07:43:53.400 回答
27

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

于 2013-02-09T11:15:59.717 回答
18

除了克里斯托弗布拉德福德在任何地方使用 HTML 转义的答案之外,由于现在大多数人不使用CGI,您还可以使用Rack

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
于 2013-01-28T20:00:55.200 回答
16

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

在您的控制器中:

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

在您看来:

<%=h @stuff %>

如果您查看 HTML 源代码:您将看到输出,但实际上并未将数据加粗。即它被编码为&lt;b&gt;Hello World!&lt;/b&gt;.

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

于 2009-03-29T19:59:47.507 回答
12

不同方法的比较:

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

我编写了自己的代码以兼容 Rails ActiveMailer 转义:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end
于 2017-02-23T22:06:23.843 回答
0

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

例如,我有一个使用文本字段生成链接的视图result[r].thtitle。文本可以包含单引号。如果我没有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 神奇地转义了。

于 2011-11-06T22:11:52.020 回答