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