如何在Ruby中编码/解码HTML实体?

Kos*_*tas 192 html ruby

我试图解码一些HTML实体,如'&amp;lt;'成为'<'.

我有一个旧的宝石(html_helpers),但似乎已经放弃了两次.

有什么建议?我需要在模型中使用它.

Dam*_*IEU 285

要对字符进行编码,您可以使用CGI.escapeHTML:

string = CGI.escapeHTML('test "escaping" <characters>')
Run Code Online (Sandbox Code Playgroud)

要解码它们,有CGI.unescapeHTML:

CGI.unescapeHTML("test &quot;unescaping&quot; &lt;characters&gt;")
Run Code Online (Sandbox Code Playgroud)

当然,在此之前你需要包含CGI库:

require 'cgi'
Run Code Online (Sandbox Code Playgroud)

如果你在Rails中,则不需要使用CGI来编码字符串.有h方法.

<%= h 'escaping <html>' %>
Run Code Online (Sandbox Code Playgroud)

  • 我首先尝试了这种方法,但它没有像"&nbsp;"那样转变实体 进入"".我想我应该指定我从一堆不同的网站获取html并需要将其保存为数据库中的纯文本. (9认同)
  • 我们已经设置了我们的数据库来保存Unicode,所以我怀疑它会抱怨.并且丝瓜不是我想要的,我不想摆脱html标签 - 不管怎么说. (3认同)
  • 如果要将HTML实体解码为存储为数据库中的纯文本,那么期望您的数据库会对不良字符抱怨很多.对编码实体进行编码,以允许它们以纯文本形式传输.对它们进行解码可以,并且很可能将它们还原为高位设置字符,即AKA二进制.几乎可能的话,你最终可能会遇到多字节字符,这会让想要纯文本的数据库感到恼火.你最好解码,直到没有任何改变,然后编码一次,所以一切都规范化,然后存储它们. (2认同)
  • 现在是 2015 年,unescapeHTML 仍然省略了一些实体,例如 A Acute (2认同)

Iva*_*rov 149

HTMLEntities可以做到:

: jmglov@laurana; sudo gem install htmlentities
Successfully installed htmlentities-4.2.4
: jmglov@laurana;  irb
irb(main):001:0> require 'htmlentities'
=> []
irb(main):002:0> HTMLEntities.new.decode "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
=> "¡I'm highly annoyed with character references!"
Run Code Online (Sandbox Code Playgroud)

  • 是的,"HTMLEntities"宝石处理的事件包括`&aring;`和`&mdash;``CGI.unescapeHTML`没有. (4认同)

Hoa*_* Le 41

我认为Nokogiri宝石也是不错的选择.它非常稳定,拥有庞大的贡献社区.

样品:

a = Nokogiri::HTML.parse "foo&nbsp;b&auml;r"    
a.text 
=> "foo bär"
Run Code Online (Sandbox Code Playgroud)

要么

a = Nokogiri::HTML.parse "&iexcl;I&#39;m highly&nbsp;annoyed with character references!"
a.text
=> "¡I'm highly annoyed with character references!"
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果您已经使用Nokogiri进行一些HTML解析,那么仅为此目的安装另一个gem是不合理的.例如,我正在使用Sanitize gem来清理HTML.原来这个宝石正在引擎盖下使用Nokogiri,所以如果不采取这种做法,那将是一种耻辱.感谢@HoangLe提示! (6认同)
  • @theTinMan,是的,我认为这取决于需求.正如您在本主题中的讨论中所看到的,"CGI.escapeHTML"可能无法解决某些情况.另一方面,如果你需要一整套支持,我相信`Nokogiri`是一个不错的选择. (3认同)

小智 35

要在Rails中解码字符,请使用:

<%= raw '<html>' %>
Run Code Online (Sandbox Code Playgroud)

所以,

<%= raw '&lt;br&gt;' %>
Run Code Online (Sandbox Code Playgroud)

会输出

<br>
Run Code Online (Sandbox Code Playgroud)

  • `#raw`不解码任何东西.它告诉视图*不*来编码字符串.它通过将字符串包装在`ActiveSupport :: SafeBuffer`中来实现这一点,而ActiveSupport :: SafeBuffer又有一个标志(`html_safe?`),设置为true.视图使用此标志来确定可以将字符串直接注入HTML而不进行转义.我喜欢将`html_safe`视为程序员指示所讨论的字符串已被正确转义. (12认同)
  • 这仅适用于视图.我需要一些在ActiveRecord中有效的东西. (5认同)
  • 刚刚在调试器中测试过 - raw'&lt br&gt'==>'&lt br&gt'. (2认同)

Jas*_*rry 8

如果你不想添加一个新的依赖项只是为了这样做(比如HTMLEntities)并且你已经在使用Hpricot它,那么它既可以逃脱也可以为你进行转换.它处理的不仅仅是CGI:

Hpricot.uxs "foo&nbsp;b&auml;r"
=> "foo bär"
Run Code Online (Sandbox Code Playgroud)

  • 现在看着这个人的注意事项 - 不再维护Hpricot. (5认同)
  • 使用[Nokogiri](http://nokogiri.org),这是XML/HTML解析的事实标准,而不是Hpricot. (2认同)