取消HTML字符串

时间:2012-05-20 22:53:38

标签: html escaping

我继承了以下字符串(我对格式无能为力):

 <iframe \n  class=\"some_class\"\n  type=\"text/html\" \n  src=\"/embed/iframe_content.html?id=tsqA5D7_z10\" \n  width=\"960\" \n  height=\"593\" \n  marginwidth=\"0\" \n  marginheight=\"0\" \n  frameborder=\"0\">\n</iframe>

我在这样的erb模板中渲染它:

<%= the_string %>

目前它呈现如下文字:

&lt;iframe  class="some_class" type="text/html" src="/embed/iframe_content.html?id=tsqA5D7_z10" width="960" height="593"  marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

我需要将其呈现为HTML。

我尝试了以下内容:

  1. <%= the_string.html_safe %>#呈现字符串不变
  2. <%= CGI.unescapeHTML(the_string) %>#带有类型错误的错误'无法复制NilClass'
  3. <%= CGI.unescapeHTML(the_string).html_safe %>#带有类型错误的错误'无法复制NilClass'
  4. <%= raw the_string %>#呈现字符串不变
  5. 如何将此字符串呈现为HTML?

5 个答案:

答案 0 :(得分:18)

正如您似乎注意到的那样,您需要注意两件事:

  1. 取消HTML实体
  2. 在视图中打印原始html
  3. 对于数字2 <%= raw ... %>应该可以正常工作。

    对于数字1 CGI.unescapeHTML是正确的想法,但我认为它不会识别所有HTML实体,因此我建议您查看HTML Entites gem

    您也可以尝试使用simple_format辅助方法,但我认为您必须为其传递一些选项以允许<iframe>标记

    我也强烈建议将你的unescaping逻辑转换为辅助方法。

答案 1 :(得分:8)

你的unescaping不能是一个字符串,这就是为什么你会遇到类型错误can't dup NilClass的错误

尝试做 s = String.new your_obj.to_s

现在做

CGI.unescapeHTML(s)

答案 2 :(得分:4)

最后我不得不使用马修建议的HTMLEntities宝石;

  1. 使用RVM安装gem并将其添加到我的Gemfile

  2. 在我的application.rb

  3. 中需要它
  4. 以下是我能正确渲染它的唯一方法。请注意围绕the_string包含的额外单引号。没有它们,尖括号不会渲染,尽管其他一切都可以。

    coder = HTMLEntities.new
    raw coder.decode("'"+the_string+"'")
    

答案 3 :(得分:1)

你可以试试这个:

<%= raw the_string %>

答案 4 :(得分:1)

版本3听起来很有价值。您没有使用the_string的原因是什么?

<%= raw CGI.unescapeHTML(the_string) %>