4

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>

<%= @mystring.html_safe %>その後、または<%= raw @mystring %>または何かを使用してビューでレンダリングできます。問題は、この方法で文字列をレンダリングすると、文字列のような部分文字列が単純に変換&#60;されること<です。最初に chr を処理し、次にタグを HTML セーフとしてレンダリングするには、一種の double raw または double unencode が必要です。

誰でも次のようなことを知っています:

<%= @my_double_safed_string.html_safe.html_safe %>
4

1 に答える 1

6

これは有効な XML ではないと思います。エンティティcdata を使用して、2 つの異なる方法でテキストを 2 回エスケープしているようです。それでも、たとえば 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>"

お役に立てれば!

于 2012-05-09T22:52:01.110 に答える