0

我正在玩 PHP Regex 以提高我的技能。

我很难理解加号 - 所以我写了以下代码:

$subject = 'aaa bbb cccc dddd';
echo preg_replace('/(\w)/',"$1*",$subject) . '<br>';
echo preg_replace('/(\w+)/',"$1*",$subject) . '<br>';
echo preg_replace('/(\w)+/',"$1*",$subject) . '<br>';

结果:

a*a*a* b*b*b* c*c*c*c* d*d*d*d*
aaa* bbb* cccc* dddd*
a* b* c* d*

我不明白为什么会出现这些结果。有人可以解释一下这个例子中发生了什么

4

2 回答 2

1

在正则表达式中,+表示one or more of the preceding character or group.

模式/(\w)/, 表示匹配单个组中的单个单词字符 ( a-zA-Z0-9_)。所以它会匹配每个字母。第一个匹配组将是 just a。替换会将每个单独的字母替换为该字母后跟一个星号。

该模式/(\w+)/将匹配一组中的一个或多个单词字符。所以它将匹配每个字母块。第一个匹配组将是aaa。替换将替换每个由多个字母组成的块,后跟一个星号。

最后一个模式/(\w)+/有点棘手,但将匹配组中的单个单词字符,但这+意味着它将匹配组中的一个或多个。所以第一个匹配是a,但是替换将替换所有组,直到没有与最后一个匹配组匹配(当然后面是一个星号)。因此,如果您尝试使用字符串aaab ccc,您的结果将最终为b* c*. b是第一个序列中的最后一个匹配组,因此替换将使用它。

于 2013-06-20T21:10:04.890 回答
0

你的错误不是加号,而是理解了父代的用途以及它是如何工作的。括号是为了将你的匹配分组到一个变量中,因此你为什么可以做 $1,第二组 () 给你 $2 等等......

  • (\w) 表示 1 个单词字符
  • (\w+) 表示 1 个或多个单词字符
  • (\w)+ 匹配 1 个或多个单词字符,但只有第一个被放入变量中,因为只有 \w 在括号内
于 2013-06-20T20:59:12.260 回答