转义HTML输出但没有换行符

时间:2010-11-01 13:31:37

标签: ruby-on-rails-3

我的模型中有一个描述文本字段。 不,我想在节目页面上添加此说明。 但由于没有换行,文本呈现丑陋。

如果我用<br/>替换它们,那么铁轨就会逃脱它们。 所以我尝试使用raw()方法。 我想逃避错误的HTML,但在我的输出中有换行符。

我最终得到了一些丑陋的代码。

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))

你有什么建议吗?

4 个答案:

答案 0 :(得分:14)

你应该使用simple_format帮助器:

<%= simple_format @place.description %>

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

答案 1 :(得分:2)

是您正在寻找的

@place.description.html_safe.gsub("\n", '<br/>')

?但是,第二个想法,html_safe这样的用法是否使网站很容易受到XSS攻击? (因为它假定description是安全的)。

所以不会有更好的解决方案

<%= (h @place.description).gsub("\n", '<br/>') %>

起初我以为

<%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>

是必需的,但实际上两个版本都有效。然后我通过向description添加一些HTML标记进行测试,并将其转义为&lt;等,因此它可以防止XSS攻击。

答案 2 :(得分:2)

3年后,但提供一个好的工作解决方案永远不会太晚

这将转义所有HTML字符,但新行(兼容的Linux,Windows和Mac)

html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe

答案 3 :(得分:1)

这是一个有效的解决方案:

<%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>

更多阅读:

Parsing newline characters in textareas without allowing all html tags

文档:

http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

来自消毒:

这个清理帮助程序将对所有标记进行html编码并删除所有未明确允许的属性。

它还会使用无效协议剥离href / src标记,例如javascript:尤其如此。它尽力抵制黑客可能使用的任何技巧,比如投入unicode / ascii / hex值来通过javascript:过滤器。查看广泛的测试套件。

您可以使用:tags选项指定允许的标签,使用:attributes选项指定属性。