如何使用PHP正则表达式压缩空格字符?

如何使用PHP正则表达式压缩空格字符?,php,regex,Php,Regex,上述申报表: $string = 'Hello this is a bunch of numbers: 333 and letters and $pecial Characters@!*('; $foo = preg_replace("/[^a-zA-Z0-9\s]/", "", $string); echo $foo; 我想保留空格,但如果不止一个,就不保留。如何做到这一点 它应该是这样的: Hello this is a bunch of numbers 333 and l

上述申报表:

$string = 'Hello    this is a bunch of numbers: 333 and letters and $pecial Characters@!*(';

$foo = preg_replace("/[^a-zA-Z0-9\s]/", "", $string);

echo $foo;
我想保留空格,但如果不止一个,就不保留。如何做到这一点

它应该是这样的:

Hello    this is a bunch of numbers 333 and letters and pecial Characters

我没有使用过PHP,但在Perl中,它类似于:

$foo = preg_replace("/[^a-zA-Z0-9\s]/", "", $string);
$foo = preg_replace('/\s+/',' ',$foo);
i、 e.用单个空格替换一个或多个空格的任何序列

因此,我认为压缩空间的PHP应该是:

s/\s+/ /g
我认为运行两个preg_replace行不应该有任何问题,尤其是如果它使代码更清晰的话。

一个正则表达式就可以:

$foo = preg_replace("/\s{2,}/", " ", $string);
全局替换(编辑已测试):


/(?嗯,这返回:hellothisabunchofnumbers333和letters和specialcharacters都混在一起。我想保留空格,只是一行不超过一个。是的,我在发布后意识到大约2秒。请参见编辑。必须将其分解为2个正则表达式,因为您正在替换w/2个不同的东西。在中的character类中仍然需要一个
\s
避免删除所有空白的第一个替换。“特殊”字符?看起来确实没有保留
$
。@是的,它应该只保留字母、数字和单个空格。啊,这很巧妙,我不认为在php中利用捕获的组,如果捕获组1未定义或为null,是否替换了空字符串?或者上次匹配中保留了$1?如果没有任何内容,则捕获的组将给出一个空字符串captured@sin-
preg_replace()
将NULL和/或未定义的捕获组值转换为空字符串。当一次只有一个匹配项的多个可选项时,这非常方便-我一直在使用它(它在Javascript中也可以工作)。我在@Crayon Violet中使用了这项技术-好的,很好知道。@ridgerunner-这里有大量正则表达式!谢谢,它的作用与perl正则表达式相同:用空格替换1个或多个\s。仅供参考preg_xxx函数使用pcre正则表达式(与perl相同)我说的是你编辑之前的版本,但我编辑了我的帖子,删除了最后一段,因为它不再是真的
$foo = preg_replace("/\s{2,}/", " ", $string);
$foo = preg_replace('/[^a-zA-Z0-9\s]|(\s)\s+/', '$1', $string);