Преобразуйте строку Ruby с символами амперсанд-хеш-символ-точка с запятой в строку, удобную для ascii или html
Использование Rails 3 Я использую XML-фид, сгенерированный в drupal или что-то в этом роде. Теги, которые он мне дает, выглядят так:
<body><![CDATA[<p>This is a title<br />A subheading</p>]]></body>
Таким образом, предполагается, что это действительно должно выглядеть так:
<p>This is a title<br />A subheading</p>
Который затем может быть представлен в виде с использованием <%= @mystring.html_safe %>
или же <%= raw @mystring %>
или что-то. Проблема в том, что рендеринг строки таким способом просто преобразует подстроки, такие как <
в <
персонаж. Мне нужно что-то вроде двойного 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[<p>This is a title<br />A subheading</p>]]></body>"
text = Nokogiri::XML.parse("<e>#{xml.text}</e>").text
#=> text = "<p>This is a title<br />A subheading</p>"
Поскольку этот друпальский сайт извергает сумасшедший двойной экранированный xml, я был бы склонен даже использовать регулярное выражение. Взломать, чтобы решить проблему, созданную взломать? ИДК. Несмотря на:
xml.text
#=> "<p>This is a title<br />A subheading</p>"
xml.text.gsub(/\&\#([0-9]+);/) { |i| $1.to_i.chr }
#=> "<p>This is a title<br />A subheading</p>"
Надеюсь это поможет!