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

StackOverflow https://stackoverflow.com/questions/9454732

  •  13-11-2019
  •  | 
  •  

Вопрос

У меня есть система, настроенная для того, чтобы пользователи отправляли свои статьи в мою базу данных.Поскольку это будет просто 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() функция от сохранения исходных новых строк?Может быть, это как-то связано с Окнами \r\n характер?

Это было полезно?

Решение

Функция, которую вы используете, 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top