Замена \ r \ n на PHP - PullRequest
       28

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

31 голосов
/ 27 марта 2011

У меня есть форма публикации, которая вставляет мой текст в базу данных 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 всегда включается в записи моей базы данных.

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

Ответы [ 6 ]

56 голосов
/ 27 марта 2011

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

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

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

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

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

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

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

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

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

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

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

10 голосов
/ 27 марта 2011

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

$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
4 голосов
/ 19 декабря 2013
   if (!is_numeric($value)) {
        $value = mysql_real_escape_string(trim($value));
        $value = str_replace("\\r\\n",'', $value);
    }
2 голосов
/ 25 апреля 2015

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

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

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

http://php.net/strtr

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

http://php.net/str_replace

0 голосов
/ 22 апреля 2019

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

$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, и результат должен быть хорошим:)

Надеюсь, кто-нибудьнашел это полезным.

0 голосов
/ 27 марта 2011

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

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

Таким образом, вы должны сделать так, чтобы \r\n в $post_text перед вставкой выглядел как *1018*, и вы сможете применить к нему функцию nl2br() перед выводом.

...