我有一个帖子表单,它将我的文本插入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
始终包含在我的数据库条目中。
我该如何解决这个问题?
答案 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() - >替换子字符串后,将不再搜索其新值。
str_replace() - >如果search是一个数组而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)
\r\n
中的文字$post_text
- 没关系,这是SQL查询的正确格式。\\r\\n
中的$post_text
在数据库中变为\r\n
- 您已将字符串转义,并且不应替换 >摆脱过度逃避 因此,您必须在插入之前在\r\n
中使其看起来像$post_text
,并且您可以在输出之前对其应用nl2br()
函数。