用PHP替换\ r \ n

时间:2011-03-27 13:43:29

标签: php mysql insert replace

我有一个帖子表单,它将我的文本插入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 个答案:

答案 0 :(得分:54)

您尝试过的所有变体的主要问题是,\n\r都是转义字符,只有在双引号字符串中使用它们时才会转义

在PHP中,'\r\n'"\r\n"之间存在很大差异。请注意第一个中的单引号和第二个中的双引号。

所以:'\r\n'将产生一个包含斜杠的四个字符串,一个'r',另一个斜杠和一个'n',而"\r\n"将包含两个字符,那些是新行和回车符。

因此,您问题的直接答案是您需要使用您在问题中提供的第二个示例,但使用双引号而不是单引号:

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

值得指出的是,这将从输入中删除所有新行,并将其替换为空。如果输入中有多个新行,则将全部删除。如果不了解您的应用程序,我不知道这是否是您想要的,但这里有一些想法:

  • 如果您只想从输入字符串的 end 中删除空行(和其他空格),则可以使用trim()函数。

  • 如果要保留输出格式以便输出,那么nl2br()功能将对您有所帮助。如果要在没有格式化的情况下输出到HTML,则可能不需要删除它们,因为浏览器不会从\ n字符中呈现换行符。

  • 如果您根据示例替换新行,则第一行的最后一个单词现在将直接运行到第二行的第一个单词,依此类推。您可能更愿意用空格而不是空格替换它们。

  • 用户可能只提交\n而没有匹配\r的输入,反之亦然(这可能是由于他们的操作系统或浏览器,或故意黑客攻击) ,或其他一些原因)。如果要替换这两个字符的所有实例,更可靠的方法是单独替换它们,而不是依赖它们彼此相邻。 str_replace()允许您通过在数组中指定它们来执行此操作。您也可以使用strtr()preg_replace()来实现相同的目标。

希望有所帮助。

答案 1 :(得分:10)

也试试

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

我建议在处理数据库条目时使用strtr()进行多次替换。 也可以使用@Spudley建议的双引号。

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

strtr() - >替换子字符串后,将不再搜索其新值。

http://php.net/strtr

  

str_replace() - >如果search是一个数组而replace是一个字符串,那么这个替换字符串将用于搜索的每个值。但是反过来没有意义。

http://php.net/str_replace

答案 4 :(得分:0)

要保留多个换行符,我正在这样做:

$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);

但这没用:(我仍然感到差距很大,因为它在h1和p标签之间添加了一个额外的[br /]。

目前,我只是告诉他们不要在html标签之间添加换行符,并且结果应该不错:)

我希望有人觉得这有用。

答案 5 :(得分:-3)

对于MySQL数据库,您不应该替换任何内容。

  • 如果它只是\r\n中的文字$post_text - 没关系,这是SQL查询的正确格式。
  • 如果\\r\\n中的$post_text在数据库中变为\r\n - 您已将字符串转义,并且不应替换 >摆脱过度逃避

因此,您必须在插入之前在\r\n中使其看起来像$post_text,并且您可以在输出之前对其应用nl2br()函数。