hello我真正想要的是 hello (没有转义双引号的反斜杠......" /> hello我真正想要的是 hello (没有转义双引号的反斜杠......"> hello我真正想要的是 hello (没有转义双引号的反斜杠......" />
ChatGPT解决这个技术问题 Extra ChatGPT

Ruby on Rails:如何将字符串呈现为 HTML?

我有

@str = "<b>Hi</b>"

在我的erb看来:

<%= @str %>

页面上将显示的内容是:<b>Hi</b> 当我真正想要的是 Hi。将字符串“解释”为 HTML 标记的 ruby 方法是什么?

编辑:情况

@str = "<span class=\"classname\">hello</span>"

如果在我看来我这样做

<%raw @str %>

HTML 源代码为 <span class=\"classname\">hello</span>我真正想要的是 <span class="classname">hello</span> (没有转义双引号的反斜杠)。 “取消转义”这些双引号的最佳方法是什么?

您也可以考虑使用 %Q[] 语法进行字符串转义。例如%Q["quotation marks"] => "\"quotation marks\"" 来源:en.wikibooks.org/wiki/Ruby_Programming/Syntax/… 不知道这是否有帮助。

u
user664833

更新

出于安全原因,建议使用 sanitize 而不是 html_safe

<%= sanitize @str %>

发生的事情是,作为一种安全措施,Rails 正在为您转义您的字符串,因为它可能嵌入了恶意代码。但是如果你告诉 Rails 你的字符串是 html_safe,它会直接通过。

@str = "<b>Hi</b>".html_safe
<%= @str %>

或者

@str = "<b>Hi</b>"
<%= @str.html_safe %>

使用 raw 可以正常工作,但它所做的只是将字符串转换为字符串,然后调用 html_safe。当我知道我有一个字符串时,我更喜欢直接调用 html_safe,因为它跳过了一个不必要的步骤并使发生的事情更清楚。 this Asciicast 中提供了有关字符串转义和 XSS 保护的详细信息。


极好的。即使搜索了一个小时,我也找不到如何做到这一点。感谢您的回答。
我一直使用 raw。很高兴知道这一点!
给未来的汉克斯=)
r
ronan_mac

使用 raw

<%=raw @str >

但正如@jmort253 正确所说,请考虑 HTML 真正属于的位置。


嗨,此解决方案有效,但有一个警告:请参阅已编辑的问题
j
jibiel

如果您在使用 Erubisrails — 最短的方法是

<%== @str >

注意双等号。 See 有关 SO 的相关问题以获取更多信息。


b
bcackerman

您还可以使用删除恶意代码的 simple_format(@str)。在此处阅读更多信息:http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format


j
jmort253

您将业务逻辑与内容混合在一起。相反,我建议将数据发送到您的页面,然后使用 JQuery 之类的东西将数据放在您需要的地方。

这样做的好处是可以将所有 HTML 保存在它所属的 HTML 页面中,这样您的网页设计人员可以稍后修改 HTML,而无需倾注服务器端代码。

或者如果你不想使用 JavaScript,你可以试试这个:

@str = "Hi"

<b><%= @str ></b>

至少这样你的 HTML 就在它所属的 HTML 页面中。


问题是,我的应用正在接收一个标记不佳的文件,并通过正则表达式将其“翻译”为良好的 HTML 标记以发送到视图。因此,正在生成的 HTML 标记是动态的,所以我无法先验地知道哪些标签应该围绕 @str。如果不在模型中,我将在哪里执行此“翻译”工作?我认为我们不应该在视图中有大量的逻辑代码。
这真的是见仁见智。在开发一个新的应用程序时,我更喜欢保持一切尽可能干净。但通常我们必须在别人留给我们的限制范围内工作。如果您的数据源返回 HTML 标记,那么可能会按照 Michael Stum 的解决方案中的描述使用“原始”。
如果您继承了对某些代码的支持,并且该代码的某些区域显示出思想或设计不佳,那么清理它以使其更易于维护确实是您的责任的一部分。当它开始是很棒的代码时,让它保持原样很好,但是当它需要工作时,让它比你发现的更好。我的部分工作是管理一些遗留应用程序;我喜欢不修复没有损坏的东西,但由于它们的编写方式,它们不能轻易增强。我不得不重写大部分函数调用,但现在使用起来要容易得多。
如果没有其他理由使用 JS,则不应使用 JavaScript 进行 HTML 插值。对于非 JS 浏览器(是的,有一些),这会破坏您的网站。
当然,如果您允许非转义内容,确保非恶意标记的责任取决于您。
A
Arman Ortega

或者你可以试试 CGI.unescapeHTML 方法。

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"

p
pjammer

既然您正在翻译,并从一个人的蹩脚编码文件中挑选出您想要的代码,您能否将 content_tag 与您的正则表达式结合使用。

从 api 文档中窃取,您可以将此翻译后的代码插入到 content_tag 中,例如:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

不知道你的代码,这种想法会确保你翻译的代码过于兼容。


我假设 translate_text 是 div 中的实际内容,对吗?即,在示例中,它会是“Hello world!”?如果translated_text 中有更多的HTML,例如嵌套的div 或span 怎么办?那我需要多次调用 content_tag 吗?
并且...抱歉早点进入...里面的每个嵌套 div/span 仍然是一个 content_tag 并且您仍然需要验证它,对吗?由于我们看不到您在进行花哨的翻译;-),因此我假设您查找所有标签,无论正则表达式是否位于 html 的“父级”...例如
    。你不会把所有的李都当作一个大屁股字符串来打印吧?每一个都是它自己的 content_tag :li,文本正确吗?
C
Crash

@str = "hello" 如果在我看来我这样做 <%raw @str %> HTML 源代码是 hello< /span> 我真正想要的是 hello (没有转义双引号的反斜杠)。 “取消转义”这些双引号的最佳方法是什么?

解决方案:在单引号内使用双引号(或在双引号内使用单引号)以避免使用反斜杠转义。

@str = '<span class="classname">hello</span>'
<%raw @str %>

G
G. A.

html_safe 版本在 Rails 4 中运行良好...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>