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


291
$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 ";

1
如果您要进行数千次替换,请避免使用preg_replace。它几乎是速度的两倍str_replace
2014年

s($str)->normalizeLineEndings('')如在该独立库中所发现的,您可能会发现有帮助。它将不仅删除LF,CR和CRLF,而且删除所有Unicode换行符。
caw

Answers:


578

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

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

多个空格和换行符替换为一个空格。

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

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

10
在使用此解决方案之前,请参阅下面的我的答案以及对该答案的评论。此解决方案可能无法按预期工作。
matsolof

1
在正则表达式“ \ s匹配空白字符”中,为什么要匹配换行符?
2014年

2
我在寻找一种解决方案,以删除/替换所有空格,而不是(双)空格。这是做到这一点的正则表达式:/(?![ ])\s+/
algorhythm 2015年

只是想让您知道,您的解决方案为我节省了很多时间。
Parthapratim Neog,2015年

183

关于已接受答案的一些评论:

+意思是“1以上”。我认为您不需要重复\s。我想你可以简单地写'/\s+/'

另外,如果要在字符串中首先删除空格,请添加trim

经过这些修改,代码将是:

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

你是对的; /\s\s+/将无法与中的换行符匹配foo\nbar
艾伦·摩尔

79

只需使用 preg_replace()

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

str_replace()尽管代码看起来不太干净,但您可以摆脱这一难题:

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

ideone直播


1
OP希望在“段落”和“用于”之间留一个空格。如果仅删除换行符,将不会有一个。
Daniel Vandersluis,2010年

请更正为$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

否则,无话可说。我认为这是最简单的答案!
erikbwork

3
@erik然后我将“更正”它。它工作正常。
NullUserException 2010年

1
@Vineet它只是一个分隔符,表示正则表达式的开始和结束
NullUserException

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

3
PHP中的转义序列需要用双引号引起来。
Daniel Vandersluis,2010年

不过,这并不能完全满足OP的要求,因为这与难以捉摸的答案相同,并且不会删除\r字符
NullUserException

@NullUser:为什么不更新自己的帖子而不是对此发表评论?
fabrik 2010年

@NullUser:除非事实是它将所有内容替换为“”而不是“”。
fabrik 2010年

12

您应该使用str_replace来提高速度,并在数组中使用双引号

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

资源不足,完美,TKS。
CONvid19 2015年

1
我可能是错的,但是此代码并不能删除Unix系统上的新行字符,因为在那些系统上,新行只是正义的\n\r\n而且我认为OP要求在单个行中放置新行的位置
Marco Demaio,

7

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

// 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);

6

可以使用preg_replace来完成PCRE正则表达式的替换:http : //php.net/manual/en/function.preg-replace.php

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

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


1
preg函数使用PCRE,而不是POSIX正则表达式。有一些ereg使用POSIX的函数,但是现在不推荐使用。
Daniel Vandersluis,2010年

5

用这个:

用空字符串替换一系列换行符:

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

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

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

请正确格式化您的代码。这是通过将相关行缩进四个空格来完成的。
jwueller

2
这就是为什么我使用单引号,所以我不需要转义那些字符。\\n看起来糟透了。\\\\ 匹配单个反斜杠真是太糟糕了。
NullUserException 2010年

5

转义\R符与通用换行符匹配

也就是说,任何被Unicode 认为是换行序列的东西。这包括由\v垂直空格)匹配的所有字符,以及多字符序列\x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

在8位非UTF-8模式下\R,等效于以下内容:(?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Regex101演示


安东,请检查,如果我的编辑没问题!添加了更多信息。
泡泡

4

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

\ r \ n-在Windows计算机上

\ r-在Apple电脑上

\ n-在Linux上

//Removes all 3 types of line breaks

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

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

3

关于:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

这应该是一个非常可靠的解决方案,因为如果我没记错的话,\ n不能在所有系统中正常工作...


这似乎并不替换\ r只是\ n:ideone.com/28KPcb
T30

如手册中所述,PHP_EOL包含当前平台的正确“行尾”符号。如果从其他平台导入字符串,或者格式化字符串的格式不正确,则可能会中断。
GDY

如果您的环境很封闭,这对我来说似乎是最优雅的解决方案,因为它的平台独立且性能可能不错……如果您有更广泛的输入(如导入/导出方案),则可能应使用正则表达式解决方案。
GDY

3

我很惊讶地看到每个人对正则表达式的了解很少。

在PHP中删除换行符是

$str = preg_replace('/\r?\n$/', ' ', $str);

在Perl中

$str =~ s/\r?\n$/ /g;

含义是为了提高效率,将行尾的换行符替换为空格(可以选择在回车符后面加上空格)。

\ n或\ 015是换行符。\ r或\ 012是回车符。?在正则表达式中表示匹配前一个字符的1或零。正则表达式中的$表示匹配行尾。

最初的最佳正则表达式参考是perldoc perlre,每个编码人员都应该非常了解此文档:http ://perldoc.perl.org/perlre.html 请注意,并非所有语言都支持所有功能。


该解决方案对我不起作用,但是如上所述,我将需要阅读更多内容才能生成实际的解决方案。我很惊讶这没有用。
亚当·沃特森

2

这是我会使用的模式

$string = preg_replace('@[\s]{2,}@',' ',$string);

2

也许这可行:

$str='\n';
echo str_replace('\n','',$str);

1

这也删除了标签

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

1

您可以尝试使用下面的代码将文本中的所有空格和换行符保留下来。

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

1

这些解决方案中有许多对我不起作用。这确实达到了目的:

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

这是参考: -PCRE和换行


0

这下面的代码工作所有文本,请使用它:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

0

您可以删除新行和多个空格。

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
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.