In Rails - Gibt es eine Rails-Methode zum Konvertieren von Zeilenumbrüchen in <br>?

115

Gibt es eine Railsy-Möglichkeit zum Konvertieren in \ n <br>?

Derzeit mache ich das so:

mystring.gsub(/\n/, '<br>')
daustin777
quelle
Was machen die beiden / Charaktere? Ich benutze "stattdessen.
Alamodey
Die zwei / Zeichen zeigen an, dass es ein regulärer Ausdruck ist
joshua.paling

Antworten:

260

Ja, Rails hat simple_formatgenau das, wonach Sie suchen, und ist etwas besser, da es auch Absatz-Tags hinzufügt. Sehen

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

Beispiel:

 simple_format(mystring)

Beachten Sie, simple_formatdass grundlegende HTML-Tags zulässig sind, aber auch Text weitergeleitet wird, durch sanitizeden alle Skripts entfernt werden. Daher sollte dies für Benutzereingaben sicher sein.

Daniel Von Fange
quelle
1
Danke - ich hätte das wissen sollen - ich habe simple_format in anderen Projekten verwendet.
daustin777
3
Es ist zu beachten, dass simple_formatder bereitgestellte Text automatisch in <p>Tags eingeschlossen wird und dass diese Funktionalität nicht vermieden werden kann.
Isaac Moore
1
simple_format ist ein Sicherheitsrisiko, wenn es für eine Web-App verwendet wird. Es basiert auf Rails, die eine spezielle Syntax wie javascript:alert(\no!\)in der Referenz angegeben interpretieren . Es kann endlose und zukünftige Variationen geben, mit denen böswillige Hacker arbeiten können.
Chloe
3
Seit Rails 4 hat simple_format die wrapper_tagOption, das <p>Tag für alles andere zu ändern
Lluís
41

Sie können es allgemeiner machen, indem Sie Folgendes tun:

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

Auf diese Weise würden Sie DOS, * NIX, Mac und versehentlich ungültige Zeilenenden abdecken.

Tomalak
quelle
5
+1 für die verallgemeinerte Nicht-Rails-Lösung. Als Ruby-Entwickler, der Rails nicht mag, gibt es viel zu wenige davon.
Winfield Trail
3
Netter Regex, danke. Wenn Sie etwas Ähnliches tun möchten, simple_formatkönnen Sie diese Regex aufteilen, mapdie Zeichenfolgen in öffnende und schließende pTags einschließen und sie dann verbinden. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinsollte es tun, obwohl ich es nicht getestet habe.
Brian Kung
Ausgezeichneter Trick @BrianKung es war genau das, wonach ich gesucht habe!
Alexventuraio
Wenn Sie die generierten HTML-Tags in einer Rails-Ansicht sicher machen möchten, führen Sie einfach Folgendes aus. Außerdem können Sie für jedes generierte Element eine Klasse hinzufügen : <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. Und es funktioniert wie ein Zauber Boohoo!
Alexventuraio
Obwohl diese Antwort ziemlich positiv bewertet wird, möchte ich hinzufügen, dass dies anfällig für Cross-Site-Scripting ist. Sie können dies nur tun, wenn Sie der Eingabe vertrauen (dh keine Benutzereingabe). Andernfalls mystringkönnte beliebiges HTML enthalten.
NobodysNightmare
29

Sie sollten vorsichtig sein, wenn Sie mit Benutzereingaben arbeiten.
simple_formatfügt <br>Tags ein, erlaubt aber andere HTML-Tags !

Wenn Sie simple_format verwenden, <b>Hello</b>wird dies als " Hallo " gerendert. Möglicherweise möchten Sie dies nicht.

Stattdessen können Sie verwenden <%= h(c.text).gsub("\n", "<br>").html_safe %>
h(), um zuerst den HTML-Code zu codieren, gsubden Zeilenumbruch zu ersetzen und html_safedie <br>Anzeige der Tags zu ermöglichen.

Dies zeigt genau an, was der Benutzer eingegeben hat. Es erlaubt auch, HTML in zB Kommentaren zu diskutieren.

jomo
quelle
ja. So funktioniert es und ich möchte die Ausgabe genau wie die Eingabe, wobei die Rückgaben angezeigt werden.
Tim
Es sind zwar simple_formatgrundlegende HTML-Tags zulässig, es ist jedoch wichtig zu beachten, dass auch der Text weitergeleitet wird sanitize, wodurch alles entfernt wird, was möglicherweise bösartig sein könnte. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy
Es ist wichtig zu beachten, dass selbst bereinigtes HTML grundlegende Links zulässt. Über einen Link können Benutzer zu einer Phishing-Site geleitet werden. Sie müssen dabei besonders vorsichtig sein, wenn Sie eine benutzergenerierte Nachricht in einer von Ihrer Anwendung gesendeten E-Mail anzeigen.
James
17

Einfach benutzen

white-space: pre-line;

in Ihrem CSS und Text werden Zeilenumbrüche umbrochen.

Bershika
quelle
Ja, nur simple_format funktioniert bei Edge-Fällen wie der Verkettung verschiedener Zeilenumbrüche nicht. zB \ r \ n \ r \ n
Emaxi
1
schöne elegante Lösung, die genau das tut, was das OP verlangt, und nichts weiter - Text mit HTML-Tags wird nicht als HTML gerendert. In meinem Fall wollte ich, dass die Ausgabe genau mit der Eingabe übereinstimmt (z. B. <b> </ b> zeigt den Text nicht fett an.
David
1

Sie können auch überlegen, was Sie tun möchten. Wenn Sie den eingegebenen Text gut formatieren, können Sie einen Filter wie Markdown in Betracht ziehen , mit dem Ihre Benutzer ihren Text formatieren können, ohne die HTML-Dose mit Würmern zu öffnen. Sie wissen, wie es hier bei Stack Overflow ist.

Jim Puls
quelle
0

Nee. Was Sie dort haben, ist die häufig verwendete Alternative. Die Definition, die die meisten Leute verwenden, ist:

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

Es wird als solches benannt, weil es die Funktionalität der gleichnamigen PHP-Funktion nachahmt .

Ryeguy
quelle
1
Ich habe nicht abgelehnt, aber ich würde sie folgendermaßen erklären: Eine Antwort, die so etwas wie simple_format nicht berücksichtigt, scheint nicht störend, aber eine mit einem definitiven "Nein". am Anfang hält Leute davon ab, weiter zu suchen.
Cesoid
0
mystring.gsub(/\r\n|\r|\n/, '\n')

arbeitete für mich


quelle
0

Sie können dies tun simple_format(h(text))- dies stellt hsicher, dass kein HTML gerendert wird.

Wie in anderen Antworten erwähnt, wird dies etwas mehr bewirken, als Sie verlangt haben. Es packt das Ganze ein <p>und fügt weitere Absätze hinzu, wenn Sie irgendwo doppelte Zeilenumbrüche haben.

Henrik N.
quelle