【问题标题】:preg_replace and asterisk [duplicate]preg_replace 和星号 [重复]
【发布时间】:2017-06-12 15:42:28
【问题描述】:

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

[^\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]* 不起作用,我怎样才能实现我想要的?

【问题讨论】:

  • * 替换为+ - /[^\s\w]+/, '/[^\s\w]*/' 匹配每个不匹配字符前的空格。
  • preg_replace('/[^\s\w]+/', ' ', $str) 正是您所需要的。
  • @WiktorStribiżew 愚蠢的我。后来我意识到你是完全正确的

标签: php regex preg-replace whitespace


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 2021-07-22
    • 2013-01-28
    • 2012-04-16
    • 2015-06-22
    • 2011-09-10
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多