我有一个帖子表单,它将我的文本插入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
总是包含在我的数据库条目中。
我怎样才能解决这个问题?
您尝试的所有变体的主要问题是\n
和\r
都是转义字符,只有在双引号字符串中使用它们时才会转义。
在PHP中,'\r\n'
和"\r\n"
之间存在很大差异。请注意第一个中的单引号和第二个中的双引号。
所以:'\r\n'
将产生一个包含斜杠,'r',另一个斜杠和'n'的四个字符串,而"\r\n"
将包含两个字符,即新行和回车符。
因此,直接回答您的问题是您需要使用您在问题中提供的第二个示例,但使用双引号而不是单引号:
$text = str_replace("\r\n",'', $text);
值得指出的是,这将从输入中删除所有新行,并将其替换为空。如果输入中有多个新行,则将全部删除。在不了解您的应用程序的情况下,我不知道这是否是您想要的,但这里有一些想法:
trim()
函数。nl2br()
函数将帮助您。如果要在没有格式化的情况下输出到HTML,则可能不需要删除它们,因为浏览器不会从\ n字符中呈现换行符。\n
提交输入而没有匹配的\r
,反之亦然(这可能是由于他们的操作系统或浏览器,或故意黑客或其他一些原因)。如果要替换这两个字符的所有实例,更可靠的方法是单独替换它们,而不是依赖它们彼此相邻。 str_replace()
允许您通过在数组中指定它们来完成此操作。您也可以使用strtr()
或preg_replace()
来实现相同的目标。希望有所帮助。
也尝试
$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
if (!is_numeric($value)) {
$value = mysql_real_escape_string(trim($value));
$value = str_replace("\\r\\n",'', $value);
}
我建议在处理数据库条目时使用strtr()进行多次替换。也可以使用@Spudley建议的双引号。
$text = strtr($text, array(
"\r\n" => "",
"\r" => "",
"\n" => "",
"\t" => " "));
strtr() - >替换子字符串后,将不再搜索其新值。
str_replace() - >如果search是一个数组而replace是一个字符串,那么这个替换字符串将用于搜索的每个值。但是反过来没有意义。
为了保留多个换行符,我这样做:
$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标签之间添加换行符,结果应该是好的:)
我希望有人发现这很有用。
\r\n
中的文字$post_text
- 没关系,它是SQL查询的正确格式。\\r\\n
中的$post_text
在数据库中变成了\r\n
- 你已经两次逃脱了你的字符串,不应该替换任何东西,而是要摆脱过多的逃避因此,你必须在插入之前使它看起来像\r\n
中的$post_text
,并且你将能够在输出之前在它上面应用nl2br()
函数。