替换为\r\n PHP

50pmv0ei  于 2022-12-25  发布在  PHP
关注(0)|答案(6)|浏览(401)

我有一个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总是包括在我的数据库条目中。
我该怎么补救呢?

cotxawn7

cotxawn71#

您尝试过的所有变体的主要问题是,\n\r都是转义字符,只有在双引号字符串 * 中使用它们时才会被转义。
在PHP中,'\r\n'"\r\n"有很大的区别,注意第一个中的单引号和第二个中的双引号。
因此:'\r\n'将产生一个包含一个斜杠、一个“r”、另一个斜杠和一个“n”的四字符字符串,而"\r\n"将包含两个字符,即换行符和回车符。
所以,对你的问题的直接回答是,你需要使用你在问题中给出的第二个例子,但要用双引号而不是单引号:

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

值得指出的是,这将从输入中删除 * 所有 * 新行,并将它们替换为空。如果输入中有多个新行,它们将全部被删除。由于不了解您的应用程序,我不知道这是否是您想要的,但这里有一些想法:

  • 如果只想从输入字符串的 end 中删除空行(和其他白色),可以使用trim()函数。
  • 如果您想保留输出到HTML的格式,那么nl2br()函数将帮助您。如果您想输出到HTML而不保留格式,那么您可能不需要删除它们,因为浏览器不会呈现\n字符的换行符。
  • 如果您不使用任何内容替换新行,按照您的示例,第一行的最后一个单词将直接与第二行的第一个单词连接,以此类推。您可能更喜欢使用空格字符替换它们,而不是不使用任何内容。
  • 用户可能只提交具有\n的输入而不提交匹配的\r,反之亦然(这可能是由于他们的操作系统或浏览器,或故意的黑客攻击,或许多其他原因)。如果您想替换这两个字符的 all 示例,更可靠的方法是单独替换它们,而不是依赖于它们彼此相邻。str_replace()允许您通过在数组中指定它们来实现这一点。您也可以使用strtr()preg_replace()来实现相同的目标。
wlwcrazw

wlwcrazw2#

也试试

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

iyr7buue3#

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

wbrvyc0a4#

我建议在处理数据库条目时使用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

0yycz8jy

0yycz8jy5#

为了保留多个换行符,我这样做:

$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_真实的_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);

但这并不起作用:(我仍然得到巨大的差距,因为它添加了一个额外的[br /]之间的h1和p标签.
现在我只是告诉他们不要在html标签之间添加换行符,结果应该是好的:)
希望有人觉得这个有用。

guicsvcw

guicsvcw6#

对于MySQL数据库,不应替换任何内容。

  • 如果它只是$post_text中的文字\r\n-没关系,它是SQL查询的正确格式。
  • 如果$post_text中的\\r\\n在数据库中变为\r\n-您已转义字符串两次,不应替换任何内容,而应消除过多的转义

所以,在插入之前,你必须让它看起来像$post_text中的\r\n,并且你可以在输出之前对它应用nl2br()函数。

相关问题