preg_replace和星号

时间:2017-06-12 15:42:29

标签: php regex preg-replace whitespace

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

[^\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,每个字符之间都有空格。如果我删除星号如下

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

然后我得到了所需的email domain com。但如果输入为email@@domain.com,那么此正则表达式将为email domain com提供emaildomain之间的两个空格,这不是我想要的。

任何人都可以解释为什么[^\s\w]*不起作用,我怎样才能实现我的目标?

1 个答案:

答案 0 :(得分:1)

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