Как добавить новую строку в MySql, когда пользователь нажимает «ввести» в textarea? [Дубликат]

Короче

Любые утверждения нулевой ширины внутри [...] теряют смысл утверждения с нулевой шириной. [\b] не соответствует границе слова (он соответствует обратному пространству, или в POSIX, \ или b), [$] соответствует буквенному символу $, [^] является либо ошибкой, либо, как в аромате регулярного выражения ECMAScript, любой символ. То же самое с \z, \Z, \A якорями.

Вы можете решить проблему, используя любой из следующих шаблонов:

[&?]list=([^&]*)
[&?]list=(.*?)(?=&|$)
[&?]list=(.*?)(?![^&])

Соответствие между последовательностью символов и один символ или конец строки (текущий сценарий)

Паттерн .*?([YOUR_SINGLE_CHAR_DELIMITER(S)]|$), предложенный Жоау Силвой ) довольно неэффективен, так как механизм регулярных выражений проверяет шаблоны, которые появляются справа от шаблона ленивых точек, и только если они не совпадают, он «расширяет» шаблон ленивого точечного изображения.

В этих случаях рекомендуется использовать отрицательный класс символов (или выражение в разговоре POSIX):

[&?]list=([^&]*)

См. демонстрацию . Подробности

  • [&?] - положительный класс символов, соответствующий либо &, либо ? (обратите внимание, что отношения между диапазонами символов / символов в классе символов являются отношениями OR)
  • list= - подстрока, последовательность символов
  • ([^&]*) - группа захвата # 1: ноль или более (*) символов, отличных от & ([^&]), столько, сколько возможно

Проверка наличия конечного одиночного разделителя символов без его возврата или окончания строки

Большинство вариантов регулярных выражений (включая JavaScript, начинающиеся с ECMAScript 2018) поддерживают образы, конструкции, которые только верните true или false, если совпадение шаблонов или нет. Они имеют решающее значение в случае, если ожидаются последовательные совпадения, которые могут начинаться и заканчиваться одним и тем же символом (см. Исходный шаблон, он может соответствовать началу строки и заканчиваться на &). Хотя это не ожидается в строке запроса, это обычный сценарий.

В этом случае вы можете использовать два подхода:

  • Положительный просмотр с чередованием, содержащим положительный класс символов: (?=[SINGLE_CHAR_DELIMITER(S)]|$)
  • Отрицательный результат с классом отрицательного символа: (?![^SINGLE_CHAR_DELIMITER(S)])

Решение с отрицательным обзором немного более эффективно, потому что оно не содержит группу чередования, которая добавляет сложности к процедуре сопоставления. Решение OP будет выглядеть как

[&?]list=(.*?)(?=&|$)

или

[&?]list=(.*?)(?![^&])

. См. эту демонстрацию regex и другую здесь .

Конечно, в случае, если конечные разделители являются многочленными последовательностями, будет работать только положительное обратное решение, поскольку [^yes] не отменяет последовательность символов, но символы внутри класса (т.е. [^yes] соответствуют любому char, но y, e и s).

397
задан mikemaccana 26 April 2017 в 15:40
поделиться

10 ответов

Это вернет все возвраты в html.

str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');
889
ответ дан Case 16 August 2018 в 10:53
поделиться
  • 1
    Еще одно примечание: str.replace("\n", '<br />') (первый аргумент является обычной строкой) заменит только первое вхождение. – Serge S. 15 April 2013 в 21:49
  • 2
    Другая версия (для замены нескольких разрывов строк): str.replace (/ (\n) + / g, '& lt; br / & gt;'); – Ritesh 16 April 2013 в 17:30
  • 3
    @SergeS. Спасибо за этот дополнительный комментарий. Просто спас меня ТОНН времени! jsfiddle – EleventyOne 11 August 2013 в 04:37
  • 4
    @SergeS., String#replace принуждает свой первый аргумент из String к экранированному экземпляру RegExp без флажков. str.replace('\n', '<br />'); эквивалентно str.replace(new RegExp('\n'), '<br />'); – eyelidlessness 19 January 2014 в 09:37
  • 5
    @Conexion, \r?\n неверен. Некоторые другие системы используют только \r. Я буду обновлять все случаи. – eyelidlessness 19 May 2014 в 20:59

Если ваша проблема только показывает разрывы строк, вы можете сделать это с помощью CSS.

HTML

<div class="white-space-pre">Some test
with linebreaks</div>

CSS

.white-space-pre {
    white-space: pre-wrap;
}

jsfiddle https://jsfiddle.net/yk1angkz/125/

Примечание. Обратите внимание на форматирование и отступы кода, поскольку white-space: pre-wrap отобразит все пробелы (за исключением последней строки новой строки после текст, см. скрипку).

251
ответ дан Bastien 16 August 2018 в 10:53
поделиться
  • 1
    Отличный ответ ... нужно больше лодок! – Ian Quigley 3 September 2015 в 08:37
  • 2
    Я приехал сюда искать регулярное выражение и ушел с этим. Во многих случаях это то, что люди ищут. Мы используем linebreaks для электронной почты и должны отображать то, что по электронной почте выглядело в строке html, иногда. Perfecto. Спасибо, что посмотрели на вопрос в другом свете – Mutmatt 1 March 2016 в 20:01
  • 3
    Это может работать для фактических разрывов строк, но что, если у меня есть «\n», как в вопросе? Могу ли я решить это с помощью CSS? – Froxx 24 May 2016 в 10:13
  • 4
    Вместо white-space: pre-wrap; я предпочитаю использовать white-space: pre-line; (чтобы не добавлять окончательную строку прерывания) – jpmottin 9 August 2016 в 17:54
  • 5
    выглядит хорошо, но как насчет гигантского пространства перед первой строкой? странный – Toolkit 4 February 2017 в 12:12

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

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'));
        }
    }
}
4
ответ дан Dmitry Dzygin 16 August 2018 в 10:53
поделиться

Это работало для меня, когда значение пришло из TextBox:

string.replace(/\n|\r\n|\r/g, '<br/>');
1
ответ дан Dr. Aaron Dishno 16 August 2018 в 10:53
поделиться

Если принятый ответ не подходит для вас, вы можете попробовать.

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

Это сработало для меня.

6
ответ дан Jethro Larson 16 August 2018 в 10:53
поделиться
  • 1
    new RegExp('\n', 'g') идентичен /\n/g (за исключением некоторых мелочей об использовании примитивных литералов и их конструкторов). – eyelidlessness 10 March 2013 в 11:37
  • 2
    независимо от причины, это сработало для меня, но принятый ответ не – nick 13 March 2013 в 11:08
  • 3
    Ах, здесь же ... но моя ошибка заключалась в том, чтобы указать /\n/g как строку! – Daniel Fortunov 15 March 2013 в 17:26

, если вы отправляете переменную из PHP, вы можете получить ее с этим перед отправкой:

$string=nl2br($string);
0
ответ дан Luca C. 16 August 2018 в 10:53
поделиться

Для тех из вас, кто просто хочет разрешить макс. 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. Затем замените его на 2 br

Вторая строка: найдите все одиночные \r\n или \n и замените их на <br>

1
ответ дан Max 16 August 2018 в 10:53
поделиться

Независимо от системы:

my_multiline_text.replace(/$/mg,'<br>');
5
ответ дан Michele Ongaro 16 August 2018 в 10:53
поделиться

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

str = str.split("\n").join("<br />");
63
ответ дан paulslater19 16 August 2018 в 10:53
поделиться
  • 1
    Если вы делаете & quot; \\n & quot; вы избежите проблем с расщеплением только на «n». – CrowderSoup 2 August 2012 в 20:19
  • 2
    @CrowderSoup хм? Я просто попробовал, и \\n не соответствует новой строке, потому что он ищет backslash + n. – paulslater19 3 August 2012 в 09:04
  • 3
    Я сделал тестовый пример. RegEx немного быстрее, но проверьте сами jsperf.com/split-join-vs-replace-regex – Aley 30 January 2015 в 20:29
  • 4
    @Послушайте, это интересно! – paulslater19 9 February 2015 в 16:43
  • 5
    Я нашел, что этот ответ не сработал, если слэш не ускользнул. Например: str = str.split (& quot;\n & quot;). Join (& quot; & lt; br / & gt; "); – ACOMIT001 29 October 2015 в 09:15

Это работает для ввода, поступающего из текстового поля

str.replace(new RegExp('\r?\n','g'), '<br />');
35
ответ дан WSkinner 16 August 2018 в 10:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: