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
,在 email
和 domain
之间有两个白色 space,这不是我想要的。
谁能解释为什么 [^\s\w]*
不起作用,我怎样才能达到我想要的效果?
发生这种情况是因为星号匹配 0 个或更多 个 [^\s\w]
实例。所以它匹配 0 个实例,然后用 space 替换它。如果您想确保至少有一个匹配项,请使用加号 (+):/[^\s\w]+/
.
我想用 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
,在 email
和 domain
之间有两个白色 space,这不是我想要的。
谁能解释为什么 [^\s\w]*
不起作用,我怎样才能达到我想要的效果?
发生这种情况是因为星号匹配 0 个或更多 个 [^\s\w]
实例。所以它匹配 0 个实例,然后用 space 替换它。如果您想确保至少有一个匹配项,请使用加号 (+):/[^\s\w]+/
.