我有一个不受信任的字符串,我想在 HTML 页面中显示为文本。我需要将字符 ' <
' 和 ' &
' 转义为 HTML 实体。越少吵架越好。
我正在使用 UTF8 并且不需要其他实体来处理重音字母。
Ruby 或 Rails 中是否有内置函数,或者我应该自己滚动?
我有一个不受信任的字符串,我想在 HTML 页面中显示为文本。我需要将字符 ' <
' 和 ' &
' 转义为 HTML 实体。越少吵架越好。
我正在使用 UTF8 并且不需要其他实体来处理重音字母。
Ruby 或 Rails 中是否有内置函数,或者我应该自己滚动?
查看 Ruby CGI类。有一些方法可以对 HTML 和 URL 进行编码和解码。
CGI::escapeHTML('Usage: foo "bar" <baz>')
# => "Usage: foo "bar" <baz>"
h
辅助方法:
<%=h "<p> will be preserved" %>
在 Ruby on Rails 3 中,HTML 默认会被转义。
对于非转义字符串,请使用:
<%= raw "<p>hello world!</p>" %>
ERB::Util.html_escape可以在任何地方使用。无需require
在 Rails 中使用即可使用。
除了克里斯托弗布拉德福德在任何地方使用 HTML 转义的答案之外,由于现在大多数人不使用CGI
,您还可以使用Rack
:
require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
您可以使用h()
或html_escape()
,但大多数人h()
按惯例使用。 h()
是html_escape()
导轨中的缩写。
在您的控制器中:
@stuff = "<b>Hello World!</b>"
在您看来:
<%=h @stuff %>
如果您查看 HTML 源代码:您将看到输出,但实际上并未将数据加粗。即它被编码为<b>Hello World!</b>
.
它会显示为<b>Hello World!</b>
不同方法的比较:
> 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 ""
我编写了自己的代码以兼容 Rails ActiveMailer 转义:
def escape_html(str)
CGI.escapeHTML(str).gsub("'", "'")
end
h()
对于转义引号也很有用。
例如,我有一个使用文本字段生成链接的视图result[r].thtitle
。文本可以包含单引号。如果我没有result[r].thtitle
在确认方法中转义,Javascript 会中断:
<%= 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>
注意::html
标题声明被 Rails 神奇地转义了。