在Rails中-是否有Rails方法将换行符转换为<br>?


115

是否有将\ n转换为的Railsy方法<br>

目前,我正在这样做:

mystring.gsub(/\n/, '<br>')

这两个/字符有什么作用?我改用“
。– alamodey

这两个/字符表示这是正常的
增值

Answers:


260

是的,rails simple_format可以完全满足您的需求,并且由于它还添加了段落标签,因此效果略好。看到

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

例:

 simple_format(mystring)

注意,它simple_format允许基本的HTML标记,但也可以传递文本来sanitize删除所有脚本,因此对于用户输入来说应该是安全的。


1
谢谢-我应该知道这一点-我在其他项目中使用了simple_format。
daustin777

3
应当注意,simple_format自动将提供的文本包装在<p>标签中,并且无法避免此功能。
艾萨克·摩尔

1
如果将simple_format用于Web应用程序,则存在安全风险。它依赖于Rails解释特殊语法,如javascript:alert(\no!\)参考资料中所述。恶意黑客可能会有无尽的变化和将来的变化。
Chloe 2013年

3
由于轨道4,simple_format有wrapper_tag选项允许改变<p>标签为别的
圣路易斯

41

您可以通过以下方法使其更通用:

mystring.gsub(/(?:\n\r?|\r\n?)/, '<br>')

这样,您将涵盖DOS,* NIX,Mac和意外的无效行结尾。


5
+1为广义的非Rails解。作为不喜欢Rails的Ruby开发人员,这些人很少。
温菲尔德步道

3
好的正则表达式,谢谢。如果要执行类似的操作,simple_format可以在该正则表达式上进行拆分,请使用map将字符串包装在开始和结束p标记中,然后再将它们连接起来。 mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.join应该做,尽管我没有测试。
布莱恩·功

@BrianKung的绝招,这正是我想要的!
alexventuraio

另外,如果您想在Rails视图中使生成的html标签安全,只需执行以下操作,还可以为每个生成的项目添加一个类:<%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>。它就像一个魅力嘘声!
alexventuraio

即使这个答案被很多人赞成,我也想补充一点,这容易受到跨站点脚本的影响。如果您信任输入(即没有用户输入),则只能这样做。否则mystring可能包含任意HTML。
没人梦ight

29

在处理用户输入时,应对此谨慎。
simple_format插入<br>标签,但将允许其他html标签

当使用simple_format时,<b>Hello</b>将呈现为“ Hello ”,您可能不希望这样做。

相反,您可以使用首先<%= h(c.text).gsub("\n", "<br>").html_safe %>
h()将html编码,gsub替换换行符并html_safe允许<br>显示标签。

这将准确显示用户输入的内容。它还允许在评论中讨论html。


是的 这样,它可以工作,我希望输出像输入一样,并显示返回值。
2015年

尽管simple_format允许使用基本的HTML标签,但要注意的是,它还会通过传递文本sanitize,从而删除了可能有害的所有内容。 apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy

重要的是要注意,甚至经过清理的HTML都允许基本链接。链接可用于将用户吸引到网上诱骗站点。如果要在应用程序发送的电子邮件中显示用户生成的消息,则必须特别小心。
詹姆斯

17

只需使用

white-space: pre-line;

在您的CSS中,文字将换行。


是的,对于诸如合并各种换行符之类的极端情况,simple_format对我不起作用。例如\ r \ n \ r \ n
emaxi'3

1
一个很好的优雅解决方案,完全可以满足OP的要求,仅此而已-带有html标签的文本不会呈现为html。在我的情况,我想输出与输入完全匹配(如<B> </ B>不会粗体显示的文字。
大卫

1

您也可能会考虑要尝试做的事情-如果要很好地格式化人们输入的文本,则可以考虑使用Markdown这样的过滤器,以使您的用户格式化文本而无需打开HTML蠕虫。您知道,就像在Stack Overflow上一样。


0

不。您所拥有的是常用的替代方法。大多数人使用的定义是:

   def nl2br text
       text.gsub(/\n/, '<br/>')
   end

之所以这样命名,是因为它以相同的名称模仿了PHP函数的功能


1
我没有投票,但是我会这样解释:一个没有考虑到诸如simple_format之类的答案似乎并不麻烦,但带有明确的“不”。刚开始时,劝阻人们不要再看了。
cesoid 2014年

0
mystring.gsub(/\r\n|\r|\n/, '\n')

为我工作


0

您可以做simple_format(h(text))h将确保不呈现任何HTML。

如其他答案中所述,这将比您要求的做更多。它将整个内容包装在中<p>,如果您在任何地方有双换行符,则会添加更多段落。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.