用 PHP 替换 \r\n
Posted
技术标签:
【中文标题】用 PHP 替换 \\r\\n【英文标题】:Replacing \r\n with PHP用 PHP 替换 \r\n 【发布时间】:2011-07-23 21:41:06 【问题描述】:我有一个帖子表单,它将我的文本插入到 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
始终包含在我的数据库条目中。
我该如何解决这个问题?
【问题讨论】:
为什么\r\n
被“自动添加”了?我会考虑修复该异常,而不是在事后尝试(徒劳地)破解它。
How to remove line breaks (no characters!) from the string? 的可能重复项
【参考方案1】:
您尝试过的所有变体的主要问题是\n
和\r
都是转义字符,只有在双引号字符串中使用它们时才会转义 .
在 php 中,'\r\n'
和 "\r\n"
之间存在很大差异。注意第一个单引号,第二个双引号。
所以:'\r\n'
将产生一个包含一个斜杠、一个“r”、另一个斜杠和一个“n”的四个字符的字符串,而 "\r\n"
将包含两个字符,即换行符和回车符.
所以你的问题的直接答案是你需要使用你在问题中给出的第二个例子,但是用双引号而不是单引号:
$text = str_replace("\r\n",'', $text);
值得指出的是,这将从输入中删除 all 新行,并将它们替换为空。如果输入中有多个新行,它们将全部被删除。在不了解您的应用程序的情况下,我不知道这是否是您想要的,但这里有一些想法:
如果您只想从输入字符串的end 中删除空行(和其他空格),则可以改用trim()
函数。
如果您想保留输出到 HTML 的格式,那么nl2br()
函数将帮助您。如果你想在没有格式化的情况下输出到 HTML,那么你可能不需要删除它们,因为浏览器不会从 \n 字符呈现换行符。
如果您用任何内容替换新行,根据您的示例,第一行的最后一个单词现在将直接运行到第二行的第一个单词,依此类推。您可能更愿意用空格字符代替它们。
有可能用户只使用\n
提交输入而没有匹配的\r
,反之亦然(这可能是由于他们的操作系统或浏览器,或者是故意的黑客攻击,或者是数字其他原因)。如果您想替换这两个字符的 all 实例,更可靠的方法是单独替换它们,而不是依赖它们彼此相邻。 str_replace()
允许您通过在数组中指定它们来做到这一点。您也可以使用strtr()
或preg_replace()
来实现相同的目标。
希望对您有所帮助。
【讨论】:
在尝试了不同的方法之后,这个解决方案确实奏效了。我明白了,在使用转义字符时,我们需要使用双引号,以便将其视为单个字符。 另外值得注意的是,我无法弄清楚为什么我不能在我的文本中替换它。我做了一个数据库导出,发现它是用双斜杠保存的,所以我将它添加到 php \\r\\n 中的另一个替换行 @carnini - 很好地找到了。您还应该考虑深入研究创建双编码斜杠的代码,因为这样的事情也表明可能存在更大的问题。解决根本问题比为它导致的损坏数据编写变通方案更好。【参考方案2】:也试试
$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
【讨论】:
@njaknjak 这很奇怪,因为它包含了公认的答案解决方案等等。 而不是使用 stri_replace,使用 str_ireplace$text = str_ireplace(array("\r","\n",'\r','\n'),'', $text);
@SandeepTawaniya 谢谢,我错过了那个流氓我【参考方案3】:
if (!is_numeric($value))
$value = mysql_real_escape_string(trim($value));
$value = str_replace("\\r\\n",'', $value);
【讨论】:
【参考方案4】:我建议在处理数据库条目时使用 strtr() 进行多次替换。 也按照@Spudley 的建议使用双引号。
$text = strtr($text, array(
"\r\n" => "",
"\r" => "",
"\n" => "",
"\t" => " "));
strtr() -> 一旦一个子字符串被替换,它的新值将不再被搜索。
http://php.net/strtr
str_replace() -> 如果 search 是一个数组并且 replace 是一个字符串,那么这个替换字符串将用于 search 的每个值。但是,反过来就没有意义了。
http://php.net/str_replace
【讨论】:
【参考方案5】:为了保留多个换行符,我这样做:
$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 标记之间添加换行符,结果应该很好:)
我希望有人发现这很有用。
【讨论】:
【参考方案6】:对于 MySQL 数据库,您不应该替换任何东西。
如果它只是文字\r\n
in $post_text
- 没关系,它是 SQL 查询的正确格式。
如果$post_text
中的\\r\\n
在数据库中变成\r\n
- 你已经转义了你的字符串两次,不应该替换任何东西,而是摆脱过度转义
因此,您必须在插入之前使其在$post_text
中看起来像\r\n
,并且您可以在输出之前对其应用nl2br()
函数。
【讨论】:
@Col。我认为我们对上下文的了解还不足以明确地说出来。 @Col.:您自己承认它“晦涩难懂”(我认为您的意思是“模糊”)。如果你不知道问题是什么,世界上所有的经验都不会帮助你写出一个好的答案。 @Tomalak 回答问题的经验是 :) @Tomalak 当一个问题不会像往常一样出现在同一个轨道上时,它变成了一个真正的混乱:) 这是一个例子:***.com/questions/5146060/…(它还包含六个已删除的答案) @Col.:否定。但是请随意继续傲慢和讨厌它。以上是关于用 PHP 替换 \r\n的主要内容,如果未能解决你的问题,请参考以下文章