PHP заменяет \ r \ n на <br />, а не заменяет новые строки - PullRequest
10 голосов
/ 28 мая 2011

В основном у меня есть этот скрипт, который я пытаюсь заменить \r\n на <br /> для правильного форматирования.Я пробовал nl2br(), и он не заменил \r\n на <br />.Вот код.

$title = isset($post[0]) ? $post[0] : false;
$body = isset($post[1]) ? preg_replace('#(\r|\r\n|\n)#', '<br/>', $post[1]) : false;
echo $title."<br/>".$body;  

Ответы [ 6 ]

16 голосов
/ 28 мая 2011
$body = isset($post[1]) ? preg_replace('#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $post[1]) : false;

Вам понадобятся три \\\.Внутри одинарных кавычек \\ преобразуется в \, поэтому \\\r становится \\r, который передается в функцию preg_replace.

Движок PREG имеет собственный набор escape-последовательностей, а \r - этоодин из них, что означает ASCII символ # 13.Чтобы заставить механизм PREG выполнять поиск литерала \r, вам нужно передать строку \\r, которую необходимо снова экранировать, поскольку она содержится в одинарных кавычках.

3 голосов
/ 28 мая 2011

Если он отображает \r и \n в вашем html, это означает, что это не переводы строк и переносы строк, а экранирование после обратной косой черты, за которым следуют r или n (например, \\r). Вам необходимо удалить эти косые черты или обновить свое регулярное выражение, чтобы учесть их.

2 голосов
/ 28 мая 2011

Вы можете попробовать это:

$body = nl2br(strtr($post[1], array('\r' => chr(13), '\n' => chr(10))));
1 голос
/ 28 мая 2011

попробуйте функцию str_replace ()

$title = isset($post[0]) ? $post[0] : false;
$body = isset($post[1]) ? str_replace('\r\n', '<br/>', $post[1]) : false;
echo $title."<br/>".$body;
1 голос
/ 28 мая 2011

Когда я читаю комментарии к вопросу, я предлагаю попробовать следующий код:

$title = isset($post[0]) ? $post[0] : false;
$body = isset($post[1]) ? preg_replace('#(\\r\\n|\\r|\\n)#', '<br/>', $post[1]) : false;
echo $title."<br/>".$body;
1 голос
/ 28 мая 2011

Как уже упоминалось @tandu, если вы видите \r или \n в html, вам нужно сначала использовать stripslashes() перед применением nl2br().Косые черты добавляются автоматически, если данные поступают из формы.

Таким образом, ваш код станет:

$title = isset($post[0]) ? nl2br(stripslashes($post[0])) : false;
$body = isset($post[1]) ? nl2br(stripslashes($post[1])) : false;
echo $title."<br/>".$body;

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Гм... просто еще одна мысль.Вы должны использовать $ _POST [0] и $ _POST [1]?

...