Замена\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 всегда включается в мои записи в базе данных.

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

Ответ 1

Основная проблема, с которой вы столкнулись со всеми вашими вариациями, состоит в том, что как \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() для достижения той же цели.

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

http://php.net/strtr

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

http://php.net/str_replace

Ответ 5

Чтобы сохранить несколько разрывов строк, я делаю это:

$tempCONTENT = mysqli_real_escape_string($con, $_POST['promotion_content']);
$tempCONTENT = str_ireplace(array("\r\n","\r","\n",'\r','\n'),'<br />', $tempCONTENT);
$previewFORMATTED = str_ireplace(array('<br /><br />'),'<br />', $tempCONTENT);
echo $previewFORMATTED;

Это используется для обработки поля формы текстовой области. Он сохраняет количество разрывов строк, введенных пользователем, изменяя их с \r\n на [br/]

Я использую это для отображения ввода, чтобы пользователь мог проверить его, прежде чем добавить его в базу данных. Использование двух кнопок отправки, одной для проверки, а другой для отправки, не позволяет этого сделать. Он просто добавляет данные, используя mysqli_real_escape_string

Затем я использую str_ireplace, чтобы превратить правильное число [br/] обратно в \r\n, чтобы я мог отобразить результат обратно в текстовую область, чтобы им было легче редактировать.

Итак, мой окончательный код выглядит так:

$tempCONTENT = mysqli_real_escape_string($con, $_POST['promotion_content']);
$tempCONTENT = str_ireplace(array("\r\n","\r","\n",'\r','\n'),'<br />', $tempCONTENT);
$previewFORMATTED = str_ireplace(array('<br /><br />'),'<br />', $tempCONTENT);
echo $previewFORMATTED;
$formOUTPUT = str_ireplace(array('<br />'),"\r\n", $previewFORMATTED);

Я проверял это на Safari и Chrome, и он отлично работает. Я не проверял IE, но на IE ничего не работает!

Но я нашел другую проблему. Если пользователь вводит HTML следующим образом:

<h1>heading</h1><p>some text</p>

это нормально, но если они делают следующее (что более вероятно)

<h1>heading</h1>
<p>some text</p>

Затем я получаю огромное пространство между заголовком и абзацем.

Я пытался исправить это с помощью этого кода:

$tempCONTENT = str_ireplace(array(">\r\n<",">\r<",">\n<",'>\r<','>\n<'),'><', $tempCONTENT);

но это не сработало :( Я все еще получаю огромный разрыв, добавляя дополнительный [br/] между тегами h1 и p.

Сейчас я просто скажу им, чтобы они не добавляли разрыв строки между тегами html, и результат должен быть хорошим :)

Я надеюсь, что кто-то нашел это полезным.

Ответ 6

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

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

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