Intereting Posts

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

У меня есть система, позволяющая пользователям отправлять свои статьи в мою базу данных. Поскольку это будет просто 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)