180

这似乎是一个骗局,但请放心,它不是——我已经搜索了 SO 以及网络的其他部分来寻找我的问题的答案,并最终一遍又一遍地找到同样不充分的“解决方案”。无论如何,这里是:

我正在将用户输入从 textarea 保存到 MySQL 数据库(在 WordPress 环境中,但我相信这与这个问题无关)。它稍后会从数据库中检索,以显示给站点后端的管理员。当用户提交带有换行符的文本时(即按 Enter 键),就会出现问题。

示例字符串可能如下所示:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

字符串中没有行尾字符(“\n”、“\r”等)。

我正在使用nl2br()它来生成 HTML 输出,但这还不够。结果是:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

据我了解,这是预期的nl2br()结果,因为它插入了标签并且不应该首先替换换行符?

但是我需要的格式是这样的:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

如果字符串中包含 EOL 字符,例如“\n”,我会使用其中一个str_replace()preg_replace()完成它,但是如果那里没有字符,我不知道用什么针来喂这些函数中的任何一个首先。

我可以手动访问数据库中的相关字段,为每个换行符点击 Backspace 以及我稍后想要对字符串执行的操作。所以我知道我需要上述格式。

4

12 回答 12

524

Ben 的解决方案是可以接受的,但str_replace()preg_replace()快得多

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

使用更少的 CPU 功率,减少世界二氧化碳排放量。

于 2013-12-21T09:59:37.877 回答
421

您应该能够用删除所有换行符和回车符的 preg 替换它。代码是:

preg_replace( "/\r|\n/", "", $yourString );

即使\n字符没有出现,如果你得到回车,那里会有一个不可见的字符。preg 替换应该抓住并修复这些。

于 2012-05-25T16:02:05.873 回答
18
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line
于 2012-05-25T16:03:13.393 回答
12

这是因为nl2br()根本不删除新行。

返回在所有换行符(、和)之前插入<br /><br> 插入的字符串。\r\n\n\r\n\r

改用str_replace

$string = str_replace(["\r\n", "\r", "\n"], "<br />", $string);
于 2015-03-03T00:26:51.500 回答
10

str_replace(PHP_EOL, null, $str);

于 2015-07-06T13:50:57.853 回答
8

您还可以使用PHP 修剪

此函数返回一个字符串,其中从 str 的开头和结尾去除了空格。如果没有第二个参数, trim() 将删除这些字符:

  • " " (ASCII 32 (0x20)),一个普通的空格。
  • "\t" (ASCII 9 (0x09)),一个制表符。
  • "\n" (ASCII 10 (0x0A)),换行(换行)。
  • "\r" (ASCII 13 (0x0D)),回车。
  • “\0”(ASCII 0 (0x00)),NUL 字节。
  • "\x0B" (ASCII 11 (0x0B)),一个垂直制表符。
于 2016-04-18T14:49:53.510 回答
7

为了在 Windows 上也能正常工作,我建议使用

$buffer = str_replace(["\r\n", "\r", "\n"], "", $buffer);

"\r\n"- 适用于 Windows,"\r"- 适用于 Mac 和"\n"- 适用于 Linux

于 2014-09-11T05:43:55.557 回答
7

功能更强大的东西(易于在任何地方使用):

function strip_carriage_returns($string)
{
    return str_replace(["\n\r", "\n", "\r"], '', $string);
}

使用PHP_EOL作为搜索替换参数也是一个好主意!荣誉。

于 2015-08-11T12:31:21.813 回答
2

我认为我的回答为时已晚,但是在 JS 脚本中使用它时遇到了同样的额外行问题,但它的工作原理是这样的

这将<br />在字符串中添加和换行符。

$text = nl2br($text);

此行将删除多余的行。

$text = preg_replace("/\r|\n/", "", $text);

在插入数据库时<br />​​用任何不需要的常用符号(如星号)替换:**

$text = str_replace("<br />","**",$text );

当我想在程序中使用它时,我用它来替换**.

$text = str_replace("**","\\n",$text );

然后$text在程序中使用

于 2021-07-14T11:11:58.980 回答
1

我使用 3 行来完成这项工作,所以将$s视为您的“东西”......

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
  • 传奇:

chr(10) ___换行

chr(13) ___回归

\r\n ______换行

于 2019-10-07T13:27:30.947 回答
0

替代内置:trim()

trim — Strip whitespace (or other characters) from the beginning and end of a string
Description ¶
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

它可以从不同类型的文本文件中删除换行符,但不处理 html。

于 2019-10-27T07:22:25.127 回答
0

您可以使用 preg_replace 来替换与正则表达式匹配的部分字符串,例如:

preg_replace("/\s+/","",$string);
于 2021-07-07T09:34:40.843 回答