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>')

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.


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.


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.


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.


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.


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 .


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.