我想用空格替换非单词非空格字符。连续可以有很多符号字符,所以我使用下面的正则表达式
[^\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
提供email
和domain
之间的两个空格,这不是我想要的。
任何人都可以解释为什么[^\s\w]*
不起作用,我怎样才能实现我的目标?
答案 0 :(得分:1)
这种情况正在发生,因为星号与[^\s\w]
的 0或更多个实例相匹配。所以它匹配0个实例,然后用空格替换它。如果您想确保至少有一个匹配项,请使用加号(+):/[^\s\w]+/
。