我有一个post表单,它将我的文本插入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条答案
按热度按时间cotxawn71#
您尝试过的所有变体的主要问题是,
\n
和\r
都是转义字符,只有在双引号字符串 * 中使用它们时才会被转义。在PHP中,
'\r\n'
和"\r\n"
有很大的区别,注意第一个中的单引号和第二个中的双引号。因此:
'\r\n'
将产生一个包含一个斜杠、一个“r”、另一个斜杠和一个“n”的四字符字符串,而"\r\n"
将包含两个字符,即换行符和回车符。所以,对你的问题的直接回答是,你需要使用你在问题中给出的第二个例子,但要用双引号而不是单引号:
值得指出的是,这将从输入中删除 * 所有 * 新行,并将它们替换为空。如果输入中有多个新行,它们将全部被删除。由于不了解您的应用程序,我不知道这是否是您想要的,但这里有一些想法:
trim()
函数。nl2br()
函数将帮助您。如果您想输出到HTML而不保留格式,那么您可能不需要删除它们,因为浏览器不会呈现\n字符的换行符。\n
的输入而不提交匹配的\r
,反之亦然(这可能是由于他们的操作系统或浏览器,或故意的黑客攻击,或许多其他原因)。如果您想替换这两个字符的 all 示例,更可靠的方法是单独替换它们,而不是依赖于它们彼此相邻。str_replace()
允许您通过在数组中指定它们来实现这一点。您也可以使用strtr()
或preg_replace()
来实现相同的目标。wlwcrazw2#
也试试
iyr7buue3#
wbrvyc0a4#
我建议在处理数据库条目时使用strtr()来进行多个替换。也可以像@Spudley建议的那样使用双引号。
strtr()-〉一旦子字符串被替换,它的新值将不会被再次搜索。
http://php.net/strtr
str_replace()-〉如果search是一个数组,replace是一个字符串,那么这个替换字符串将用于search的每个值,匡威则没有意义。
http://php.net/str_replace
0yycz8jy5#
为了保留多个换行符,我这样做:
这正用于处理文本区域表单域。它保留用户输入的换行符数,将其从\r\n更改为[br /]
我使用这个来显示输入,这样用户可以在我将其添加到数据库之前检查它。使用两个提交按钮,一个用于检查,另一个用于提交,这并不起作用。它只是使用mysqli_真实的_escape_string添加数据
然后,我使用str_ireplace将正确的[br /]数转换回\r\n,这样我就可以将结果回显到文本区域,以便于编辑。
我的最终代码如下所示:
我已经在Safari和Chrome上测试过了,效果很好。我还没有测试过IE,但IE上什么都不管用!
但是我发现了另一个问题,如果用户输入HTML如下:
这很好,但如果他们执行以下操作(哪种可能性更大)
然后我在标题和段落之间得到了一个巨大的空间。
我试着用这个代码修复它:
但这并不起作用:(我仍然得到巨大的差距,因为它添加了一个额外的[br /]之间的h1和p标签.
现在我只是告诉他们不要在html标签之间添加换行符,结果应该是好的:)
希望有人觉得这个有用。
guicsvcw6#
对于MySQL数据库,不应替换任何内容。
$post_text
中的文字\r\n
-没关系,它是SQL查询的正确格式。$post_text
中的\\r\\n
在数据库中变为\r\n
-您已转义字符串两次,不应替换任何内容,而应消除过多的转义所以,在插入之前,你必须让它看起来像
$post_text
中的\r\n
,并且你可以在输出之前对它应用nl2br()
函数。