Преобразование новой строки в представленный текст в PHP

У меня есть система, настроенная на то, чтобы пользователи могли отправлять свои статьи в мою базу данных. Так как это будет просто HTML, я не хочу ожидать, что они будут знать, чтобы напечатать <br /> каждый раз, когда есть новая строка, поэтому я использую функцию PHP nl2br() на входе.

Я также предоставляю инструмент для модификации статей, который вернет их статьи в форму (однако это другая страница) и позволит им редактировать ее. При этом, <br /> элементы появлялись также (с символами новой строки все еще). Чтобы исправить
элементы, появляющиеся (что я ожидал, так или иначе), я добавил preg_replace('/<br(\s+)?\/?>/i', "\n", mysql_result($result,$i,"content")) который я нашел в другом вопросе на этом сайте. Это делает работу по удалению <br /> элементы, но поскольку он заменяет их новыми строками, а новые строки в любом случае остались бы изначально, каждый раз, когда редактируется сообщение, будет добавляться все больше и больше новых строк, каждый раз все больше и больше отступая от абзацев. Это то, что пользователь не поймет.

Например, скажем, я ввожу следующее в форму отправки статьи:

 Hello, this is my article.
 I am demonstrating a new line here.

Это преобразует в:

Hello, this is my article.<br />
I am demonstrating a new line here.

Обратите внимание, что, хотя символ новой строки был преобразован, в тексте по-прежнему есть новая строка. В форме редактирования <br /> будет преобразован обратно в новую строку и будет выглядеть так:

Hello, this is my article.

I am demonstrating a new line here.

Поскольку <br /> была преобразована в новую строку, но уже была новая строка. Итак, я думаю, что я ожидаю, что он будет первоначально преобразован во что-то вроде этого:

Hello, this is my article.<br />I am demonstrating a new line here.

Мне интересно... есть ли способ остановить nl2br() функция от поддержания оригинальных строк? Может быть, это связано с Windows \r\n персонаж?

3 ответа

Решение

Функция, которую вы используете, nl2br используется для их вставки, но не замены. Если вы хотите заменить \n с <br /> вам просто нужно использовать str_replace, Вот так:

$string = str_replace("\n","<br />",$string);

В этой ситуации абсолютно нет необходимости в регулярных выражениях.

Похоже, что описанная вами проблема - не ошибка, а особенность bl2br. Вы можете просто написать свою собственную функцию для этого, например:

<?php
function NlToBr($inString)
{
    return preg_replace("%\n%", "<br>", $inString);
}
?>

Я нашел это в комментариях к документации функции nl2br в руководстве по PHP: http://php.net/manual/de/function.nl2br.php. Если тот, который я разместил, не работает для вас, должно быть еще много, откуда он взялся.

(Или просто используйте функцию из другого Ответа, который был только что опубликован, я думаю, это тоже должно работать)

Это должно исправить это:

preg_replace('/<br(\s+)?\/?>(?!\s*\n)/i', "\n", mysql_result($result,$i,"content"))

Вы не можете просто удалить разрывы, потому что они могут быть на одной линии. Это регулярное выражение заменит все разрывы с новой строки, но не те, которые следуют за новой строкой.

Это покинет <br>\n в тексте. Дополнительное регулярное выражение избавит от них:

preg_replace('/<br(\s+)?\/?>/i', "", $res)
Другие вопросы по тегам