У Rails - чи існує метод рейків для перетворення нових рядків у формат?


115

Чи є спосіб Railsy перетворити \ n в <br>?

В даний час я роблю це так:

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

Що роблять два / персонажі? Я використовую натомість "
аламодея

Дві / символи вказують, що це регулярна експресія
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>теги, і цього функціоналу не уникнути.
Ісаак Мур

1
simple_format - це ризик для безпеки, якщо використовувати його для веб-програми. Він спирається на Rails, що інтерпретує спеціальний синтаксис, як javascript:alert(\no!\)зазначено в посиланні. Зловмисні хакери можуть працювати з нескінченними варіантами та майбутніми варіантами.
Хлоя

3
Оскільки в рейках 4, у simple_format є wrapper_tagопція, яка дозволяє змінити <p>тег на що-небудь інше
Lluís

41

Ви можете зробити це більш загальним, зробивши:

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

Таким чином ви покриєте DOS, * NIX, Mac та випадкові недійсні закінчення рядків.


5
+1 для узагальненого рішення, що не належить до Rails. Як розбійник Рубі, який не любить Рейки, їх дуже мало.
Winfield Trail

3
Гарний вираз, дякую. Якщо ви хочете зробити щось подібне до simple_formatвас, ви можете розділити на цей регулярний вираз, використовуйте mapдля загортання рядків у pтеги, що відкриваються та закриваються , а потім приєднуйтесь до них. mystring.split(/(?:\n\r?|\r\n?)/).map {|s| "<p>#{s}</p>"}.joinповинен це зробити, хоча я цього не перевіряв.
Брайан Кунг

Відмінний трюк @BrianKung, саме це я шукав!
alexventuraio

Крім того, якщо ви хочете , щоб згенеровані HTML - теги в безпеці в рейках дивитися, просто зробити що - щось на зразок цього , а також ви можете додати клас для кожного створюваного елемента: <%= sanitize(planning.benefits.split(/(?:\n\r?|\r\n?)/).map {|x| "<li class='collection-item'>#{x}</li>"}.join) %>. І це працює як чарівний буху!
alexventuraio

Незважаючи на те, що ця відповідь доволі сильна, я хочу додати, що це сприятливо до сценаріїв на різних сайтах. Ви можете це зробити лише в тому випадку, якщо ви довіряєте вкладеному (тобто немає вводу користувача). Інакше mystringможе містити довільний HTML.
NobodysNightmare

29

Ви повинні бути обережними з цим, коли ви маєте справу з введенням користувача.
simple_formatвставляє <br>теги, але це дозволить інші теги html !

При використанні simple_format <b>Hello</b>буде відображатися як " Привіт ", можливо, ви цього не хочете.

Замість цього ви можете використовувати <%= h(c.text).gsub("\n", "<br>").html_safe %>
h(), що кодує html спочатку, gsubзамінює розрив рядка та html_safeдозволяє відображати <br>теги.

Це відобразить саме те, що ввів користувач. Це також дозволяє обговорити html, наприклад, у коментарях.


так. як це, це працює, і я хочу, щоб результат був точно так же, як і вхід, із показаними показниками.
Тім

Хоча 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

1
приємне елегантне рішення, яке робить саме те, що вимагає ОП, і більше нічого - текст з HTML-тегами не відображатиметься як html. у моєму випадку я хотів, щоб результат точно відповідав вводу (напр., <b> </b> не відображатиме текст жирним шрифтом.
Девід

1

Ви також можете розглянути, що ви намагаєтесь зробити - якщо ви добре форматуєте текст, який ввели люди, ви можете розглянути фільтр, як Markdown, щоб ваші користувачі могли форматувати текст, не відкриваючи баночку з хробаками, що є HTML. Ви знаєте, як тут у Stack Overflow.


0

Ні. У вас є альтернатива, що часто використовується. Більшість людей використовує визначення:

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

Він названий як такий, тому що він імітує функціональність функції PHP за однойменною назвою .


1
Я не заявив, але пояснив би їх так: Відповідь, яка не враховує щось на зразок simple_format, здається, не набридає, але відповідає з остаточним "Nope". на початку відлякує людей дивитися далі.
цезоїд

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

працював на мене


0

Ви можете зробити це simple_format(h(text))- hгарантуватиме, що будь-який HTML не буде надано.

Як було сказано в інших відповідях, це зробить трохи більше, ніж ви просили. Це завершує всю справу <p>і додає більше абзаців, якщо у вас є десь подвійні нові рядки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.