我正在玩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*
我不明白为什么会出现这些结果。有人可以解释一下这个例子中发生了什么
答案 0 :(得分:1)
在正则表达式中,+
表示one or more of the preceding character or group
。
模式/(\w)/
,表示在单个组中匹配单个单词字符(a-zA-Z0-9_
)。所以它会匹配每个字母。第一个匹配组将只是a
。替换将用该字母后跟星号替换每个单独的字母。
模式/(\w+)/
将匹配组中的一个或多个单词字符。所以它将匹配每个字母块。第一个匹配组将为aaa
。替换将替换每个多个字母的块后跟一个星号。
最后一个模式/(\w)+/
稍微有点棘手,但会匹配组中的单个字符,但+
表示它会匹配一个或多个组。因此,第一个匹配将是a
,但替换将替换所有组,直到与最后一个匹配组(当然后跟星号)不匹配为止。因此,如果您尝试使用字符串aaab ccc
,则结果最终会为b* c*
。 b
是第一个序列中最后一个匹配的组,因此替换将使用它。
答案 1 :(得分:0)
你的错误不是加号,而是了解治疗的目的是什么以及它是如何起作用的。括号用于将匹配分组为变量,因此为什么你可以做$ 1,第二组()给你$ 2等等......