Railsでは-改行を<br>に変換するrailsメソッドはありますか?


115

\ nをに変換するRailsyの方法はあり<br>ますか?

現在、私は次のようにしています:

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

2つの/文字は何をしますか?私の代わりに、「使用しています。
alamodey

2つの/文字は、それが通常の表現であることを示しています
joshua.paling

回答:


260

はい、レールは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>タグで囲まれ、この機能は回避できないことに注意してください。
Isaac Moore

1
simple_formatは、Webアプリに使用する場合のセキュリティリスクです。javascript:alert(\no!\)リファレンスに記載されているような特別な構文を解釈するRailsに依存しています。悪意のあるハッカーが使用する無限のバリエーションと将来のバリエーションが存在する可能性があります。
クロエ

3
4レール以来、simple_formatがありwrapper_tag、変更することができますオプション<p>何か他のタグ
リュイス・

41

次のようにすることで、より一般的にすることができます。

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

このようにして、DOS、* NIX、Mac、および偶発的な無効な行末をカバーします。


5
一般化された非Railsソリューションの場合は+1。Railsが嫌いなRuby開発者として、これらの数は非常に少ないです。
Winfield Trail

3
いい正規表現、ありがとう。simple_formatその正規表現で分割できるのと同じようなことをしたい場合は、を使用mapして開始pタグと終了タグで文字列をラップし、それらを結合します。 mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.join私はそれをテストしませんでしたが、それをすべきです。
Brian Kung

素晴らしいトリック@BrianKungそれはまさに私が探していたものでした!
alexventuraio 2016

また、生成されたhtmlタグをrailsビューで安全にしたい場合は、次のようにしてください。また、生成されたアイテムごとにクラスを追加できます<%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>。そしてそれは魅力的なブーフーのように機能します!
alexventuraio 2016

この回答はかなり賛成されていますが、これはクロスサイトスクリプティングの影響を受けやすいことを付け加えておきます。入力を信頼できる場合(つまり、ユーザー入力がない場合)にのみ実行できます。そうでなければmystring、任意のHTMLが含まれる可能性があります。
NobodysNightmare 2017年

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について議論することもできます。


うん。このように動作し、入力と同じように出力を表示し、戻り値を表示します。
Tim

simple_formatは基本的なHTMLタグを許可しますが、テキストもを通過させることに注意してくださいsanitize。これにより、悪意のある可能性のあるものはすべて削除されます。 apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy 2016

サニタイズされたHTMLでも基本的なリンクが許可されることに注意することが重要です。リンクを使用して、ユーザーをフィッシングサイトに誘導することができます。アプリケーションから送信されたメールにユーザー生成メッセージを表示している場合は、特に注意が必要です。
ジェームズ

17

単に使う

white-space: pre-line;

あなたのCSSとテキストで改行で折り返します。


うん、simple_formatは、さまざまな改行を連結するようなエッジケースでは機能しません。例:\ r \ n \ r \ n
emaxi

1
OPが要求することを正確に実行する優れたエレガントなソリューション-htmlタグ付きのテキストはhtmlとしてレンダリングされません。。私の場合、私は正確に入力(例:<B> </ B>は太字のテキストは表示されません一致するように出力を望んでいた
デビッド・

1

また、何をしようとしているのかを検討することもできます。ユーザーが入力したテキストを適切にフォーマットする場合は、Markdownのようなフィルタを使用して、HTMLであるワームの缶を開かずにユーザーがテキストをフォーマットできるようにすることもできます。ご存知のように、Stack Overflowにあるように。


0

いいえ。あなたが持っているものは、一般的に使用される代替手段です。ほとんどの人が使用する定義は次のとおりです。

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

同じ名前でPHP関数の機能を模倣しているため、このような名前が付けられています。


1
私は反対票を投じませんでしたが、私はそれらをこのように説明しました:simple_formatのようなものを考慮に入れられない答えは煩わしく見えませんが、明確な「いいえ」のあるものです。初めは人々はそれ以上見ないようにします。
セソイド2014

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

私のために働いた


0

できますsimple_format(h(text))–これhにより、HTMLがレンダリングされなくなります。

他の回答で述べたように、これはあなたが要求したよりも少し多くのことをします。すべてをで囲み、<p>二重の改行がある場合はさらに段落を追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.