如何从字符串中删除换行符(无字符!)?


146

这似乎是骗人的,但请放心,事实并非如此-我在SO和网络的其余部分中搜索了我的问题的答案,并最终一遍又一遍地找到同样不足的“解决方案”。无论如何,这是这样的:

我正在将用户输入从文本区域保存到MySQL数据库(在WordPress环境中,但是我认为这与该问题无关紧要)。稍后从数据库中检索它,以在站点的后端显示给Admins。当用户提交带有换行符的文本(即按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,以后再对字符串进行处理。所以我知道我需要以上格式。


如果该字符串看起来像您的第一个示例,那么如何说其中没有换行符呢?至少有两个:“谢谢!”之后连续两个
欧内斯特·弗里德曼·希尔

恩纳尔@ ErnestFriedman-Hill,您显然是对的-那里有“东西”,它既不可见也不是我所不知道的。
约翰内斯·皮尔2012年

我也看不到没有换行符的新行怎么可能。您可以使用十六进制编辑器检查字符串吗?我确定您会找到换行符...
荨麻

Answers:


376

您应该能够用一个能去除所有换行符和回车符的预浸料代替它。代码是:

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

即使\n没有出现这些字符,如果要返回回车,那里也会有一个不可见的字符。胎片替换应抓住并修复这些。


难以置信的。我本可以发誓尝试按照您的答案和@bsdnoobz的答案进行所有尝试,但两者都能完成任务。哦,好了,无论我在那里有什么精神障碍,你们俩都节省了我很多时间。我想这真是一个愚蠢的问题。多谢你们!
约翰内斯·皮尔

3
请注意,这不会匹配所有换行符,即Windows系统上创建的换行符。为了捕捉这些,您可以改用以下RegEx/\r|\n|\r\n/
Toastrackenigma

6
使用\ R(代表任何行结束序列)stackoverflow.com/a/16274784/1491212
Armel Larcier,

435

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

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

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


5
不能相信这个答案没有得到更多的信任。在preg_replace()上
对此表示赞扬

62
重要说明:在回车和换行代码之间使用双引号。如果使用单引号,这些将无法正确处理!
bwright 2014年

47
竖起大拇指->“使用更少的CPU能力,减少了世界上的二氧化碳排放。”
1

3
@Joeri:最后一个永远不会被调用,因为它将由前两个处理。这是多余的代码。
nightfox89 2015年

4
@Joeri考虑到str_replace会删除所有出现的内容,\ r和\ n都不会全部删除吗?
Bram Vanroy

16
$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

11

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

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

使用str_replace来代替:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);

7

您也可以使用PHP trim

此函数返回从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)),垂直制表符。

3
这只会在字符串的开头和结尾定位换行符。字符串中间的换行符将保持不变。
mickmackusa

6

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

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

"\r\n"-对于Windows,"\r"-对于Mac和"\n"-对于Linux


2
对不起,队友,但即使是在12年前问过的那个人,我也可以肯定地告诉你,这是多余的。问问自己以下问题:如果将所有\r\n都删除了,为什么直接跟在后面的人不是这种情况?
Johannes Pille 2014年

真的,这个明显的事情还没引起我的注意...谢谢:)我只是意识到我遇到了麻烦,但这是相反的,我\r\n在Windows上使用过,但在Linux上却无法使用。
Ajjaah 2014年

好吧,我正在使用此功能用逗号替换换行符,因此地址是单行文本,因此替换\r\nFIRST会有所帮助,因为这意味着如果该换行符,则每个部分用一个逗号而不是两个逗号
Martin

@Martin是的,您是对的,我刚刚意识到相同,所以我们\r\n首先替换,然后我们替换\r\n,我已经编辑了答案。
Ajjaah 2015年

这仍然是多余的,如果您要删除所有\r\r,则无需删除\r\n,则用户str_replace(array("\r","\n"), "", $buffer);可以得到相同的结果。
stramin '19

6

str_replace(PHP_EOL,null,$ str);


1
虽然这可能会回答问题。建议对您的回答进行一些解释。
Anirudh Sharma 2015年

读取字符串时,PHP_EOL并不总是有效。当你写它们的时候。
nightfox89

纯代码的答案在StackOverflow上价值不高,因为它们对教育OP和未来的读者几乎没有作用。
mickmackusa

4

功能更多(易于在任何地方使用):

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

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


1

替代内置: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。


0

我用3行代码来完成这项工作,因此将$ s视为您的“东西” ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.