将带有ampersand-hash-char-semicolon字符的Ruby字符串转换为ascii或html友好字符串

时间:2012-05-09 22:12:41

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

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

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

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

任何人都知道如下:

<%= @my_double_safed_string.html_safe.html_safe %>

1 个答案:

答案 0 :(得分:5)

我不认为这是有效的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,我甚至倾向于使用正则表达式。黑客解决黑客创建的问题? IDK。无论:

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

希望这有帮助!