Замена \ r \ n на PHP

У меня есть форма сообщения, которая вставляет мой текст в базу данных MySQL.

я использую

$post_text = mysql_real_escape_string(htmlspecialchars($_POST['text'])); 

и хотите заменить \r\n который был автоматически добавлен.

Я пытался

 $text = str_replace('\\r\\n','', $text); $text = str_replace('\r\n','', $text); $text = str_replace('\\R\\N','', $text); $text = str_replace('\R\N','', $text); $text = str_replace('/\r\\n','', $text); $text = str_replace('/r/n','', $text); $text = str_replace('/\R\\N','', $text); $text = str_replace('/R/N','', $text); 

но \r\n всегда включается в мои записи в базе данных.

Как я могу это исправить?

Основная проблема, с которой вы столкнулись со всеми вашими вариациями, состоит в том, что \n и \r являются escape-символами, которые только экранированы, когда вы используете их в строке с двумя кавычками .

В PHP существует большая разница между '\r\n' и "\r\n" . Обратите внимание на одиночные кавычки в первом и двойные кавычки во втором.

Итак: '\r\n' приведет к четырехсимвольной строке, содержащей косую черту, «r», другую косую черту и «n», тогда как "\r\n" будет содержать два символа, являющиеся новой строкой и символы возврата каретки.

Поэтому прямой ответ на ваш вопрос заключается в том, что вам нужно использовать второй пример, который вы дали в вопросе, но с двойными кавычками вместо одиночных кавычек:

 $text = str_replace("\r\n",'', $text); 

Стоит отметить, что это приведет к удалению всех новых строк из ввода и заменяет их ничем. Если на входе имеется более одной новой строки, все они будут удалены. Не зная больше о вашем приложении, я не знаю, это то, что вы хотите, но вот некоторые мысли:

  • Если вы хотите удалить пустые строки (и другое пустое пространство) с конца строки ввода, вы можете использовать функцию trim() .

  • Если вы хотите сохранить форматирование для вывода в HTML, то nl2br() поможет вам. Если вы хотите выводить на HTML без форматирования, вам может и не понадобиться их удалять, так как браузер не будет отображать разрывы строк из \ n символов.

  • Если вы заменяете новые строки ничем, в соответствии с вашим примером последнее слово первой строки теперь будет работать непосредственно в первом слове второй строки и так далее. Вы можете заменить их символом пробела, а не ничего.

  • Возможно, пользователи могут вводить ввод только с \n без соответствия \r или наоборот (это может быть связано с их ОС или браузером или преднамеренным взломом или по ряду других причин). Если вы хотите заменить все экземпляры обоих этих символов, более надежным способом сделать это будет замена их по отдельности, вместо того, чтобы полагаться на то, что они находятся рядом друг с другом. str_replace() позволяет сделать это, указав их в массиве. Вы можете также использовать strtr() или preg_replace() для достижения той же цели.

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

попробуйте также

 $text = str_ireplace(array("\r","\n",'\r','\n'),'', $text); 
  if (!is_numeric($value)) { $value = mysql_real_escape_string(trim($value)); $value = str_replace("\\r\\n",'', $value); } 

Я бы предложил использовать strtr () для множественной замены при работе с записями базы данных. Также используйте двойные кавычки, как предложил @Spudley.

 $text = strtr($text, array( "\r\n" => "", "\r" => "", "\n" => "", "\t" => " ")); 

strtr () -> Как только подстрока была заменена, ее новое значение больше не будет искать.

http://php.net/strtr

str_replace () -> Если поиск – это массив, а replace – строка, то эта строка замены используется для каждого значения поиска. Однако обратное не имело смысла.

http://php.net/str_replace

Для базы данных MySQL вы ничего не должны заменять.

  • в случае, если это просто буквально \r\n в $post_text – все в порядке, это правильный формат для SQL-запроса.
  • в случае, если это \\r\\n в $post_text которое становится \r\n в базе данных – вы дважды избегаете своей строки и не должны ничего заменять, а скорее избавляетесь от чрезмерного экранирования

Итак, вы должны сделать его похожим на \r\n в $post_text перед вставкой, и вы сможете применить к nl2br() функцию nl2br() перед выходом.