用PHP替换\ r \ n

问题描述 投票:31回答:6

我有一个帖子表单,它将我的文本插入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总是包含在我的数据库条目中。

我怎样才能解决这个问题?

php mysql insert replace
6个回答
56
投票

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

在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()来实现相同的目标。

希望有所帮助。


10
投票

也尝试

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

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

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


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标签之间添加换行符,结果应该是好的:)

我希望有人发现这很有用。


-3
投票

For a MySQL database you shouldn't replace anything.

  • 如果它只是\r\n中的文字$post_text - 没关系,它是SQL查询的正确格式。
  • 如果\\r\\n中的$post_text在数据库中变成了\r\n - 你已经两次逃脱了你的字符串,不应该替换任何东西,而是要摆脱过多的逃避

因此,你必须在插入之前使它看起来像\r\n中的$post_text,并且你将能够在输出之前在它上面应用nl2br()函数。

© www.soinside.com 2019 - 2024. All rights reserved.