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

kch*_*kch 93 html ruby encode escaping ruby-on-rails

我有一个不受信任的字符串,我想在HTML页面中显示为文本.我需要以HTML实体的形式逃避字符' <'和' &'.越少越好.

我正在使用UTF8,并且不需要其他实体用于重音字母.

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

小智 137

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

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

  • 谢谢,这很好,因为它可以从控制器完成.当然不是我会这样做的. (11认同)
  • 我更喜欢它的同义词:[CGI.escape_html](http://apidock.com/ruby/v1_9_3_392/CGI/escape_html/class) (4认同)
  • 这在功能/集成测试中非常有用,用于检查插入到模板中的内容的正确性(当内容应该被HTML转义时). (2认同)

Tre*_*ble 89

hhelper方法:

<%=h "<p> will be preserved" %>
Run Code Online (Sandbox Code Playgroud)

  • 对于那些感兴趣的人来说,`h`是`html_escape`的别名 (16认同)
  • 它偶尔*需要在XHTML中由于XML规范相当恼人的坚持,']]>'被保留在文本之外(参见'CharData'产生).这使得它总是更容易(并且无害)来逃避它. (12认同)

RSK*_*RSK 77

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

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

<%= raw "<p>hello world!</p>" %>
Run Code Online (Sandbox Code Playgroud)


Vik*_*rón 25

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


J-_*_*_-L 15

除了克里斯托弗·布拉德福德在任何地方使用HTML转义的答案之外,因为大多数人现在都不使用CGI,你也可以使用Rack:

require 'rack/utils'
Rack::Utils.escape_html('Usage: foo "bar" <baz>')
Run Code Online (Sandbox Code Playgroud)


Bri*_*ndy 13

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

在你的控制器中:

@stuff = "<b>Hello World!</b>"
Run Code Online (Sandbox Code Playgroud)

在你看来:

<%=h @stuff %>
Run Code Online (Sandbox Code Playgroud)

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

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


Dor*_*ian 9

比较不同的方法:

> 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;"
Run Code Online (Sandbox Code Playgroud)

我自己编写了与Rails ActiveMailer转义兼容:

def escape_html(str)
  CGI.escapeHTML(str).gsub("&#39;", "'")
end
Run Code Online (Sandbox Code Playgroud)