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