W Railsach - czy istnieje metoda rails do konwersji znaków nowej linii na <br>?

115

Czy istnieje sposób Railsy na konwersję \ n do <br>?

Obecnie robię to tak:

mystring.gsub(/\n/, '<br>')
daustin777
źródło
Co robią dwie / postacie? Zamiast tego używam „
alamodey
Dwa znaki / wskazują, że jest to regularne
wyrażenie

Odpowiedzi:

260

Tak, railsy mają simple_formatdokładnie to, czego szukasz, i są nieco lepsze, ponieważ dodają także znaczniki akapitu. Widzieć

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

Przykład:

 simple_format(mystring)

Zauważ, że simple_formatzezwala na podstawowe znaczniki HTML, ale także przekazuje tekst, przez sanitizektóry usuwa wszystkie skrypty, więc powinno być bezpieczne dla wprowadzania danych przez użytkownika.

Daniel Von Fange
źródło
1
Dzięki - powinienem był to wiedzieć - użyłem simple_format w innych projektach.
daustin777
3
Należy zauważyć, że simple_formatautomatycznie zawija podany tekst w <p>znaczniki i nie można tego uniknąć.
Isaac Moore,
1
simple_format jest zagrożeniem bezpieczeństwa, jeśli używasz go w aplikacji internetowej. Opiera się na Railsach interpretujących specjalną składnię, taką javascript:alert(\no!\)jak podano w referencji. Mogą istnieć nieskończone warianty i przyszłe odmiany, z którymi hakerzy będą mogli pracować.
Chloe,
3
od rails 4, simple_format ma wrapper_tagopcję, która pozwala zmienić <p>tag na cokolwiek innego
Lluís
41

Możesz uczynić to bardziej ogólnym, wykonując:

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

W ten sposób zakryjesz DOS, * NIX, Mac i przypadkowe nieprawidłowe zakończenia linii.

Tomalak
źródło
5
+1 dla uogólnionego rozwiązania innego niż Rails. Jako programista Ruby, który nie lubi Railsów, jest ich zdecydowanie za mało.
Winfield Trail
3
Niezłe wyrażenie regularne, dzięki. Jeśli chcesz zrobić coś podobnego do tego simple_format, możesz podzielić na tym wyrażeniu regularnym, użyj, mapaby zawinąć ciągi w otwierające i zamykające pznaczniki, a następnie je połączyć. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinPowinienem to zrobić, chociaż tego nie testowałem.
Brian Kung,
Doskonała sztuczka @BrianKung to było dokładnie to, czego szukałem!
alexventuraio,
Także, jeśli chcesz, aby wygenerowane znaczniki HTML bezpieczne w szynach zobaczyć, po prostu zrobić coś takiego, a także można dodać klasę dla każdego generowanego pozycji: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. I działa jak urok, boohoo!
alexventuraio,
Mimo że ta odpowiedź jest bardzo pozytywnie oceniana, chcę dodać, że jest ona podatna na cross-site scripting. Możesz to zrobić tylko wtedy, gdy ufasz wejściu (tj. Brakowi danych wejściowych użytkownika). W przeciwnym razie mystringmoże zawierać dowolny kod HTML.
NobodysNightmare
29

Powinieneś zachować ostrożność, gdy masz do czynienia z wprowadzaniem danych przez użytkownika.
simple_formatwstawia <br>tagi, ale pozwoli na inne tagi HTML !

Gdy używasz simple_format, <b>Hello</b>będzie renderowane jako „ Hello ”, możesz tego nie chcieć.

Zamiast tego możesz użyć, <%= h(c.text).gsub("\n", "<br>").html_safe %>
h()najpierw zakoduje kod HTML, gsubzastąpi podział wiersza i html_safeumożliwi wyświetlanie <br>tagów.

Spowoduje to wyświetlenie dokładnie tego, co wprowadził użytkownik. Pozwala również na omawianie html np. W komentarzach.

jomo
źródło
tak. tak, to działa i chcę, aby dane wyjściowe były takie same, jak dane wejściowe, z pokazanymi zwrotami.
Tim
Chociaż simple_formatzezwala na podstawowe znaczniki HTML, należy zauważyć, że przekazuje również tekst sanitize, co usuwa wszystko, co może być potencjalnie złośliwe. apidock.com/rails/ActionView/Helpers/TextHelper/simple_format
linesarefuzzy
Należy zauważyć, że nawet oczyszczony kod HTML umożliwia korzystanie z podstawowych linków. Odsyłacz może służyć do kierowania użytkowników do witryny phishingowej. Musisz być szczególnie ostrożny, jeśli wyświetlasz wiadomość wygenerowaną przez użytkownika w wiadomości e-mail wysłanej przez Twoją aplikację.
James
17

Po prostu użyj

white-space: pre-line;

w twoim css, a tekst będzie zawijany przy podziałach linii.

bershika
źródło
Tak, po prostu simple_format nie działa dla mnie w skrajnych przypadkach, takich jak łączenie różnych nowych linii. np. \ r \ n \ r \ n
emaxi
1
ładne, eleganckie rozwiązanie, które robi dokładnie to, czego żąda OP i nic więcej - tekst ze znacznikami html nie będzie renderowany jako html. w moim przypadku chciałem, aby dane wyjściowe dokładnie pasowały do ​​danych wejściowych (np. <b> </b> nie wyświetli tekstu pogrubionego.
David
1

Możesz również rozważyć, co próbujesz zrobić - jeśli ładnie formatujesz tekst, który wprowadzili ludzie, możesz rozważyć filtr taki jak Markdown, aby umożliwić użytkownikom formatowanie tekstu bez otwierania puszki robaków, która jest HTML. Wiesz, tak jak w Stack Overflow.

Jim Puls
źródło
0

Nie. To, co tam masz, jest powszechnie używaną alternatywą. Definicja, której używa większość ludzi, to:

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

Jest tak nazwany, ponieważ naśladuje funkcjonalność funkcji PHP o tej samej nazwie .

ryeguy
źródło
1
Nie głosowałem przeciw, ale wyjaśniłbym je w ten sposób: odpowiedź, która nie bierze pod uwagę czegoś takiego jak simple_format, nie wydaje się kłopotliwa, ale zawiera definitywne „nie”. na początku zniechęca ludzi do dalszego szukania.
cesoid
0
mystring.gsub(/\r\n|\r|\n/, '\n')

pracował dla mnie


źródło
0

Możesz to zrobić simple_format(h(text))-h sprawi, że żaden kod HTML nie zostanie renderowany.

Jak wspomniano w innych odpowiedziach, zrobi to nieco więcej, niż prosiłeś. Zawija całość <p>i dodaje więcej akapitów, jeśli masz gdziekolwiek podwójne znaki nowej linii.

Henrik N
źródło