Преобразование новой строки в представленный текст в 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)