Преобразуйте строку Ruby с символами амперсанд-хеш-символ-точка с запятой в строку, удобную для ascii или html

Использование Rails 3 Я использую XML-фид, сгенерированный в drupal или что-то в этом роде. Теги, которые он мне дает, выглядят так:

<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; в < персонаж. Мне нужно что-то вроде двойного raw или двойного unencode, чтобы сначала разобраться с chr, а затем отобразить теги как html safe.

Кто-нибудь знает что-нибудь вроде:

<%= @my_double_safed_string.html_safe.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>"

Поскольку этот друпальский сайт извергает сумасшедший двойной экранированный 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>"

Надеюсь это поможет!

Другие вопросы по тегам