【问题标题】:Convert Ruby string with ampersand-hash-char-semicolon characters into an ascii or html friendly string将带有 &-hash-char-semicolon 字符的 Ruby 字符串转换为 ascii 或 html 友好字符串
【发布时间】:2012-05-09 22:12:41
【问题描述】:

使用 Rails 3 我正在使用在 drupal 或其他东西中生成的 XML 提要。它给我的标签看起来像:

<body><![CDATA[&#60;p&#62;This is a title&#60;br /&#62;A subheading&#60;/p&#62;]]></body>

所以我们的意图是它应该看起来像这样:

<p>This is a title<br />A subheading</p>

然后可以使用&lt;%= @mystring.html_safe %&gt;&lt;%= raw @mystring %&gt; 或其他东西在视图中呈现。问题在于以这种方式呈现字符串只会将&amp;#60; 之类的子字符串转换为&lt; 字符。我需要一种双重原始或双重未编码来首先处理 chr,然后 然后 将标签呈现为 html 安全。

任何人都知道类似的事情:

<%= @my_double_safed_string.html_safe.html_safe %>

【问题讨论】:

  • 看起来 raw 和 html_safe 不编码或解码字符串,它们只是将它们标记为安全的以包含在您的文档中 - 这是一种针对跨站点脚本错误的保护机制。

标签: ruby-on-rails ruby html-entities html-safe


【解决方案1】:

我认为这不是有效的 XML - 他们通过使用实体 cdata 以两种不同的方式对文本进行了两次转义。不过,您可以使用 nokogiri 解析它,例如:

require 'nokogiri'

xml = Nokogiri::XML.parse "<body><![CDATA[&#60;p&#62;This is a title&#60;br /&#62;A subheading&#60;/p&#62;]]></body>"
text = Nokogiri::XML.parse("<e>#{xml.text}</e>").text
#=> text = "<p>This is a title<br />A subheading</p>"

看到这个drupal 网站正在喷出疯狂的双重转义xml,我什至倾向于使用正则表达式。黑客解决问题的黑客创建?身份证。无论如何:

xml.text
#=> "&#60;p&#62;This is a title&#60;br /&#62;A subheading&#60;/p&#62;"
xml.text.gsub(/\&\#([0-9]+);/) { |i| $1.to_i.chr }
#=> "<p>This is a title<br />A subheading</p>"

希望这会有所帮助!

【讨论】:

  • 是的,在 CDATA 中使用实体令人困惑,有点违背了使用 CDATA 的目的。
  • 仅供参考,如果这个 drupal 提要是 RSS 或 Atom 提要,你应该看看ruby-doc.org/stdlib-1.9.3/libdoc/rss/rdoc/index.html - 这是一个包含在 ruby​​ 中的提要解析器/生成器库 - 你可以将它与 gsub- 结合使用这个答案中的解决方案可以避免 nokogiri 依赖,如果你喜欢这种事情的话。不过Nokogiri非常棒!
  • 技术上它是有效的,但完全没有必要。
  • 有效如“不会使解析器崩溃”或有效如正确表达包含 html 作为元素文本主体的字符串的意图?如果这应该以更有用的方式解析,也许是时候修复 nokogiri 了!
  • 太棒了,我正在考虑自己尝试破解正则表达式,但这次可能要采用双 Nokogiri 解析。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2010-09-17
  • 1970-01-01
  • 2010-12-09
相关资源
最近更新 更多