从字符串中删除换行符并替换为一个空格

354
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

希望从字符串中删除所有换行符。

我有这个正则表达式,它可以匹配所有的换行符,问题是我不知道应该使用哪个函数来处理它。

/\r\n|\r|\n/

$string 应该变成:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

2
如果你需要进行成千上万次的替换操作,请避免使用 preg_replace。它的速度几乎比 str_replace 慢一倍。 - Alex W
你可能会发现s($str)->normalizeLineEndings('')很有用,它可以在这个独立库中找到。它不仅可以删除LF、CR和CRLF,还可以删除任何Unicode换行符。 - caw
21个回答

684

您必须注意双换行符,这会导致双倍空格。使用此非常有效的正则表达式:

$string = trim(preg_replace('/\s\s+/', ' ', $string));

多个空格和换行符都会被替换成一个空格。

编辑:正如其他人指出的那样,此解决方案在匹配单词之间的单个换行符时存在问题。虽然在示例中不存在此问题,但可以很容易地看到如何发生这种情况。一个替代方法是执行以下操作:

$string = trim(preg_replace('/\s+/', ' ', $string));

11
在使用此解决方案之前,请查看我的下面的答案以及对我的回答的评论。该解决方案可能不会按照您的预期工作。 - matsolof
1
在正则表达式中,“\s 匹配空白字符”,为什么它会匹配换行符? - Michael Z
2
我正在寻找一种解决方案来删除/替换所有的空格,但不包括(双重)空格。这是实现它的正则表达式:/(?![ ])\s+/ - algorhythm
1
我想告诉您,您的解决方案为我节省了大量时间。 - Parthapratim Neog
2
错误。\s匹配任何空格,包括空格、制表符、换行符和回车符。我不知道为什么会有这么多赞。要匹配换行符,您需要使用\r?\n,它是一个可选的回车符后跟一个换行符。 - ekerner

208

对被接受的答案有一些评论:

+表示“1个或多个”。我认为你不需要重复使用\s,只需写成'/\s+/'即可。

此外,如果您想删除字符串中开头和结尾的空格,请添加trim

使用这些修改后,代码应为:

$string = preg_replace('/\s+/', ' ', trim($string));

你是对的;/\s\s+/ 无法匹配 foo\nbar 中的换行符。 - Alan Moore

112

只需使用preg_replace()函数即可。

$string = preg_replace('~[\r\n]+~', '', $string);

你可以使用str_replace()来解决这个问题,尽管代码看起来不够简洁:

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

请到ideone网站查看实时演示。


1
OP希望在“段落”和“for”之间有一个空格。如果只删除换行符,就不会有一个。 - Daniel Vandersluis
否则就没有更多可说的了。我认为这是最简单的答案! - erikbstack
3
那我就会对它进行“不正确化”的修改。它现在的样子已经没问题了。 - NullUserException
我必须像这样使用“\n”:$row->title = str_replace("\n", '', $row->title); - Alex Spencer
1
@Vineet 这只是一个分隔符,用于表示正则表达式的开始和结束。 - NullUserException
显示剩余8条评论

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

4
在 PHP 中,转义序列需要用双引号引起来。 - Daniel Vandersluis
这并不完全符合OP的要求,因为这与elusive的答案相同,并且没有删除\r字符。 - NullUserException
@NullUser:为什么不更新你自己的帖子,而是在这里评论? - fabrik
@NullUser:除了它用 '' 替换所有内容而不是 ' ' 的事实之外, - fabrik

22

我不确定这对已提交的答案是否有任何价值,但我可以将其发布。

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);

1
我喜欢这个基于OP的解决方案。preg_replace可能会很慢。但是使用带有数组的str_replace是一个很好的解决方案。理论上,$searches中的第三个选项是不需要的,因为这些字符已经被替换了。但是你可以将它移到前面先去掉它们。 - PromInc

16

你应该使用str_replace函数,因为它的速度更快,并且要使用带有数组的双引号。

str_replace(array("\r\n","\r"),"",$string);

资源占用低,完美,谢谢。 - Pedro Lobito
2
我可能错了,但是这段代码在Unix系统上并没有删除换行符,因为在这些系统上,换行符只是\n而不是\r\n。此外,我认为OP正在要求将单个空格放在换行符的位置。 - Marco Demaio
1
@MarcoDemaio,只需将 "\n", "\n\r" 添加到数组中即可。 - Karel Wintersky

12

转义序列\R匹配通用换行符

也就是说,所有被Unicode视为断行序列的字符都会被匹配,这包括由\v垂直空白符)匹配的所有字符,以及多字符序列\x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);
在8位非UTF-8模式下,\R等同于以下内容:(?>\r\n|\n|\x0b|\f|\r|\x85)...pcre.org Regex101演示

Anton,请检查一下我的编辑是否正确!我添加了一些进一步的信息。 - bobble bubble

10

文本中的换行通常表示为:

\r\n - 在Windows计算机上

\r - 在苹果电脑上

\n - 在Linux上

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);

7

可使用preg_replace进行PCRE正则表达式替换: http://php.net/manual/zh/function.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

将换行符或回车符替换为一个空格。如果您不想替换它们,请将第二个参数更改为''


1
preg 函数使用 PCRE 而不是 POSIX 正则表达式。虽然有使用 POSIX 的 ereg 函数,但它们现在已被弃用。 - Daniel Vandersluis

5

使用以下代码:

将一系列换行符替换为空字符串:

$string = preg_replace("/[\\n\\r]+/", "", $string);

或者您可能想用一个空格替换换行符:

$string = preg_replace("/[\\n\\r]+/", " ", $string);

请正确格式化您的代码。方法是将相关行缩进四个空格。 - jwueller
2
这就是为什么我使用单引号,这样我就不需要转义那些字符。 \\n 看起来很糟糕。为了匹配一个反斜杠,使用 \\\\ 简直太糟了。 - NullUserException

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接