将制表符和空格替换为单个空格,将回车符和换行符替换为单个换行符

2022-08-30 12:01:14
$string = "My    text       has so    much   whitespace    




Plenty of    spaces  and            tabs";

echo preg_replace("/\s\s+/", " ", $string);

我阅读了PHP的文档并遵循了教程,但是此代码生成:preg_replace()

My text has so much whitespace Plenty of spaces and tabs

我怎么能把它变成:

My text has so much whitespace    
Plenty of spaces and tabs

答案 1

首先,我想指出,新行可以是 \r、\n 或 \r\n,具体取决于操作系统。

我的解决方案:

echo preg_replace('/[ \t]+/', ' ', preg_replace('/[\r\n]+/', "\n", $string));

如有必要,可以分成2行:

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

更新

更好的解决方案是这个:

echo preg_replace('/[ \t]+/', ' ', preg_replace('/\s*$^\s*/m', "\n", $string));

艺术

$string = preg_replace('/\s*$^\s*/m', "\n", $string);
echo preg_replace('/[ \t]+/', ' ', $string);

我已经将正则表达式更改为使多个行中断为一个更好的正则表达式。它使用“m”修饰符(使 ^ 和 $ 匹配新行的开头和结尾),并删除任何 \s(空格、制表符、换行符、换行符)字符,这些字符是字符串的结尾和下一个行的开头。这解决了只有空格的空行的问题。在我前面的例子中,如果一行充满了空格,它就会跳过一行。


答案 2

编辑了正确的答案。从 PHP 5.2.4 左右开始,以下代码将起作用:

echo preg_replace('/\v(?:[\v\h]+)/', '', $string);

推荐