У меня есть система, позволяющая пользователям отправлять свои статьи в мою базу данных. Поскольку это будет просто HTML, я не хочу ожидать, что они узнают, что они будут печатать <br />
каждый раз, когда есть nl2br()
, поэтому я использую функцию 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
?
Функция, которую вы используете, 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)