ChatGPT解决这个技术问题 Extra ChatGPT

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

$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 ";
如果您要进行数千次替换,请避免使用 preg_replace。它的速度几乎是 str_replace 的两倍。
this standalone library 中所示,您可能会发现 s($str)->normalizeLineEndings('') 很有帮助。它不仅会删除 LF、CR 和 CRLF,还会删除任何 Unicode 换行符。

j
jwueller

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

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

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

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

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

在使用此解决方案之前,请参阅下面的答案以及对我的答案的评论。此解决方案可能无法按您的预期工作。
在正则表达式“\s 匹配空白字符”中,为什么它会匹配换行符?
我正在寻找一种解决方案来删除/替换所有空格但不是(双)空格。这是执行此操作的正则表达式:/(?![ ])\s+/
只是想让您知道您的解决方案为我节省了很多时间。
错误的。 \s 匹配任何空格,包括空格、制表符、换行符、回车符。我不知道这是怎么得到这么多赞成票的。要匹配换行符,您需要 \r?\n 这是一个可选的换行符,前面有一个回车符。
m
matsolof

对已接受答案的一些评论:

+ 表示“1 个或多个”。我认为您无需重复\s。我认为你可以简单地写 '/\s+/'

此外,如果要删除字符串中的第一个和最后一个空格,请添加 trim

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

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

你是对的; /\s\s+/ 将无法匹配 foo\nbar 中的换行符。
N
NullUserException

只需使用 preg_replace()

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

您可以在这个上使用 str_replace(),尽管代码看起来不那么干净:

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

ideone 现场观看


OP希望在“段落”和“for”之间有一个空格。如果您只是删除换行符,则不会有一个。
请将其更正为 $string = preg_replace("~[\r\n]~", "",$string);
否则就没什么好说的了。这是最简单的答案,我想!
@erik然后我会“纠正”它。它可以正常工作。
@Vineet这只是一个分隔符,表示正则表达式的开始和结束
f
fabrik
$string = str_replace(array("\n", "\r"), ' ', $string);

PHP 中的转义序列需要双引号。
不过,这并不完全符合 OP 的要求,因为这与 elusive 的答案相同,并且它没有删除 \r 字符
@NullUser:您为什么不更新自己的帖子而不是对此发表评论?
@NullUser:除了它用''而不是''替换所有内容。
R
RobertPitt

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

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

资源少,完美,tks。
我可能错了,但这段代码不会删除 Unix 系统上的换行符,因为在这些系统上,换行符只是 \n 而不是 \r\n 而且我认为 OP 要求用一个空格代替换行符
@MarcoDemaio,只需将 "\n", "\n\r" 添加到数组中。
J
Jimmix

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

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

b
bobble bubble

Escape sequence \R 匹配通用换行符

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

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

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

Regex101 Demo


安东请检查,如果我的编辑是好的!添加了一些进一步的信息。
D
Dave

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

\r\n - 在 Windows 计算机上

\r - 在苹果电脑上

\n - 在 Linux 上

//Removes all 3 types of line breaks

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

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

n
n00dle

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

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

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


preg 函数使用 PCRE,而不是 POSIX,正则表达式。有 ereg 个函数使用 POSIX,但现在已弃用。
N
NullUserException

用这个:

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

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

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

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

请正确格式化您的代码。这是通过将相关行缩进四个空格来完成的。
这就是我使用单引号的原因,所以我不需要转义这些字符。 \\n 看起来很糟糕。 \\\\ 匹配单个反斜杠真是太糟糕了。
G
GDY

关于:

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

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


这似乎没有取代 \r 而只是 \n: ideone.com/28KPcb
如手册中所述,PHP_EOL 包含当前平台的正确“行尾”符号。如果您从其他平台导入字符串,或者您的字符串格式不正确,这可能会中断。
如果您有一个非常封闭的环境,这对我来说似乎是最优雅的解决方案,因为它独立于平台并且可能非常高效......如果您有更广泛的输入,例如导入/导出场景,您可能应该使用正则表达式解决方案。
e
ekerner

看到大家对正则表达式知之甚少,我感到很惊讶。

在 php 中去除换行符是

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

在 perl 中

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

意思是用空格替换行尾的任何换行符(为了提高效率) - 可选地以回车符开头。

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

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


该解决方案对我不起作用,但如前所述,我需要阅读更多内容以生成实际解决方案。我很惊讶这不起作用。
@AdamWhateverson 不,以上是正确的。也许你的字符串有文字反斜杠 n 而不是换行符?此外,在某些语言中,您可能需要添加 m(多行)修饰符。
A
Adam Whateverson

其中许多解决方案对我不起作用。但这确实成功了:-

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

这是参考:- PCRE and New Lines


终于经过1天的搜索!真的非常感谢🌹
这是 100% 更好的解决方案。我遇到了奇怪的换行符问题,我只是无法抓住通常的嫌疑人。我尝试替换 \n、\036、\n\r、\025、\n 和 \r... 都不起作用。然而,这个解决方案就像一个魅力!
R
Rajeev

这是我会使用的模式

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

u
user3213174

这个也删除了标签

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

P
PCMShaper

您可以尝试下面的代码将保留文本中的任何空格和新行。

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

ز
زياد

也许这有效:

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

R
Ramesh

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

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

echo $name;

M
Minco

很简单

$hello = "
A
B
C
";
str_replace("
", " ", $hello);
// A B C

佚名

以下代码适用于所有文本,请使用它:

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

K
Kashif

使用上述解决方案的组合,这一行对我有用

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

它删除了“\r”和“\n”。