preg_replace 和星号

preg_replace and asterisk

我想用 space 替换非单词非 space 字符。连续可以有很多符号字符,所以我使用下面的正则表达式

[^\s\w]*

所以,我使用的代码是:

$str = 'email@domain.com';
echo preg_replace('/[^\s\w]*/', ' ', $str); 

我期待得到 email domain com 但我得到 e m a i l d o m a i n c o m,每个字符之间有白色 spaces。如果我像下面这样删除星号

echo preg_replace('/[^\s\w]/', ' ', $str);

然后我得到了想要的email domain com。但是,如果输入是 email@@domain.com,则此正则表达式将给出 email domain com,在 emaildomain 之间有两个白色 space,这不是我想要的。

谁能解释为什么 [^\s\w]* 不起作用,我怎样才能达到我想要的效果?

发生这种情况是因为星号匹配 0 个或更多 [^\s\w] 实例。所以它匹配 0 个实例,然后用 space 替换它。如果您想确保至少有一个匹配项,请使用加号 (+):/[^\s\w]+/.