Як замінити всі розриви рядків у рядку елементами <br />?


536

Як я можу прочитати розрив рядка зі значення JavaScript та замінити всі перерви рядка <br />елементами?

Приклад:

Змінна передана від PHP, як показано нижче:

  "This is man.

     Man like dog.
     Man like to drink.

     Man is the king."

Я хотів би, щоб мій результат виглядав приблизно так, після перетворення JavaScript:

  "This is man<br /><br />Man like dog.<br />Man like to drink.<br /><br />Man is the king."

1
Щось не так у вашому первісному запитанні? stackoverflow.com/questions/784313 / ...
Harto

1
Ви також можете зробити nl2br ($ string) в PHP, перш ніж відправити його в JavaScript.
alex

1
Я буду голосувати за закриття попереднього питання, оскільки це є кращим прикладом.
безпліддя

2
Тоді він повинен відредагувати початкове запитання
nickf

Я прийшов сюди з неправильного розуміння того, що відбувається з .text (). Дивіться stackoverflow.com/q/35238362/1467396, якщо це теж ви робите
Девід

Відповіді:


1202

Це перетворить усі прибутки в HTML

str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');

Якщо вам цікаво, що?: Означає. Його називають групою, яка не захоплює. Це означає, що група регулярних виразів в дужках не буде збережена в пам'яті, на яку буде посилатися пізніше. Ви можете ознайомитись з цими потоками для отримання додаткової інформації:
https://stackoverflow.com/a/11530881/5042169 https://stackoverflow.com/a/36524555/5042169


77
Просто додаткове зауваження: str.replace("\n", '<br />')(перший аргумент - це звичайний рядок) замінить лише перше виникнення.
Серж С.

19
Інша версія (для заміни декількох перерв рядків): str.replace (/ (\ n) + / g, '<br />');
Ritesh

4
@SergeS. Дякую за додатковий коментар. Щойно врятував мене ТОННЕ часу! jsfiddle
EleventyOne

4
@SergeS., String#replaceПримушує свій перший аргумент від Stringпобіжного RegExpнаприклад, без прапорів. str.replace('\n', '<br />');рівнозначноstr.replace(new RegExp('\n'), '<br />');
безглаздість

2
Ось тестовий випадок порівняння з str.split("\n").join("<br />") jsperf.com/split-join-vs-replace-regex RegEx здається трохи швидшим
Алей

390

Якщо ваше занепокоєння є лише відображенням рядкових рядків, ви можете зробити це за допомогою CSS.

<div style="white-space: pre-line">Some test
with linebreaks</div>

Jsfiddle: https://jsfiddle.net/5bvtL6do/2/

Примітка . Зверніть увагу на форматування коду та відступ, оскільки white-space: pre-lineвідображатимуться всі нові рядки (крім останнього нового рядка після тексту, див. Скрипку).


59
Чудова відповідь ... потрібно більше плавців!
Ian Quigley

11
Я прийшов сюди шукати вираз і пішов з цим. Багато разів це те, що люди шукають. Ми використовуємо переривання рядків для електронних листів і нам потрібно відображати, як іноді виглядав рядок електронної пошти в HTML. Perfecto. Дякуємо, що
подивились

1
Це може працювати для фактичних розривів рядків, але що робити, якщо у мене питання "\ n" схоже на запитання? Чи можу я вирішити це також CSS?
Froxx

18
Замість цього white-space: pre-wrap;я віддаю перевагу використанню white-space: pre-line;(щоб не додати остаточну лінію розриву)
jpmottin

5
добре виглядає, але як бути з гігантським простором перед першим рядком? weird
Інструментарій

71

Без регулярного вираження:

str = str.split("\n").join("<br />");

2
Якщо ви робите "\\ n", ви уникнете проблем із розщепленням лише на "n".
CrowderSoup

10
@CrowderSoup хм? Я просто спробував це і \\nне відповідає новому рядку, тому що він шукає backslash+ n.
paulslater19

1
Я зробив тестовий випадок. RegEx трохи швидше, але перевірте самі jsperf.com/split-join-vs-replace-regex
Алей

Я виявив, що ця відповідь не спрацювала, якщо не вдалося уникнути косої риски. Наприклад: str = str.split ("\ n"). Join ("<br />");
ACOMIT001

@ ACOMIT001 Я думаю, це залежить від того, чи має рядок новий рядок або чорну рису і n?
paulslater19

38

Це працює для введення даних із текстової області

str.replace(new RegExp('\r?\n','g'), '<br />');

1
Це найкраща відповідь для мене, тому що ви не забули те, яке використовується в деяких системах
Bartłomiej Zalewski

1
Це найкраща відповідь на це питання. Але я просто поїду з <br> не <br /> Дивіться цей один stackoverflow.com/questions/1946426/html-5-is-it-br-br-or-br
kheya

8

Якщо прийнята відповідь не працює для вас, ви можете спробувати.

str.replace(new RegExp('\n','g'), '<br />')

Це працювало для мене.


2
new RegExp('\n', 'g')є ідентичним /\n/g(за винятком деяких деталей щодо використання примітивних літералів проти їх конструкторів).
безглазкість

2
незалежно від причини, це працювало для мене, але прийнята відповідь не стала
нік

1
Ах, тут же ... але мою помилку намагалася вказати /\n/gяк рядок!
Даніель Фортунов

7

Незалежно від системи:

my_multiline_text.replace(/$/mg,'<br>');

1
Попередження: Це додає тег "<br>" до будь-якого рядка, незалежно від того, чи є в ньому \ \ n ".
mkoeller

4

Також важливо кодувати решту тексту, щоб захистити від можливих атак на введення сценарію

function insertTextWithLineBreaks(text, targetElement) {
    var textWithNormalizedLineBreaks = text.replace('\r\n', '\n');
    var textParts = textWithNormalizedLineBreaks.split('\n');

    for (var i = 0; i < textParts.length; i++) {
        targetElement.appendChild(document.createTextNode(textParts[i]));
        if (i < textParts.length - 1) {
            targetElement.appendChild(document.createElement('br'));
        }
    }
}


2

Для тих із вас, хто просто хоче дозволити макс. 2 <br>підряд, ви можете використовувати це:

let text = text.replace(/(\r?\n){2,}/g, '<br><br>');
text = text.replace(/(\r?\n)/g, '<br>');

Перший рядок: шукайте \nАБО \r\nтам, де принаймні 2 з них є підряд, наприклад \n\n\n\n. Потім замініть його на 2br

Другий рядок: знайдіть усіх одиночних \r\nабо \nзамініть їх<br>


1

якщо ви надсилаєте змінну з PHP, ви можете отримати її за допомогою цього, перш ніж надсилати:

$string=nl2br($string);

0

Він замінить всю нову лінію на перерву

str = str.replace(/\n/g, '<br>')

Якщо ви хочете замінити всю нову лінію на одну лінію розриву

str = str.replace(/\n*\n/g, '<br>')

Детальніше про Regex читайте: https://dl.icewarp.com/online_help/203030104.htm, це допоможе вам щоразу.


Також можна використовувати такий вираз str = str.replace(/\n+/g, '<br>')для другого випадку
Маттео Бассо

0

Не відповідаючи на конкретне запитання, але я впевнений, що це допоможе комусь ...

Якщо у вас є вихід з PHP, який ви хочете візуалізувати на веб-сторінці за допомогою JavaScript (можливо, результат запиту Ajax), і ви просто хочете зберегти пробіл та розриви рядків, подумайте про те, що просто вкладете текст всередину <pre></pre>блоку:

var text_with_line_breaks = retrieve_some_text_from_php();
var element = document.querySelectorAll('#output');
element.innerHTML = '<pre>' + text_with_line_breaks + '</pre>';

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