请有人帮我一把。为什么我得到以下输出
$pattern = "#([a-z])*|(chol)#";
preg_match($pattern, 'chol',$m);
print_r($m) // array
(
[0]=> 'chol',
[1]=> 'l'
)
为什么匹配的第一个子捕获只有l
个字符,而完全匹配为chol
。可能是我错过了什么。
我期望这个输出低于
array
(
[0]=> 'chol',
[1]=> 'chol'
)
我不认为这种模式让我感到困惑太复杂了。
答案 0 :(得分:3)
您量化了一个群体。您需要量化[a-z]
字符类。
使用
$pattern = "#([a-z]*)|(chol)#";
在PHP demo查看Repeating a Capturing Group vs. Capturing a Repeated Group及更多详情。简而言之:([a-z]*)
将匹配并捕获0个或更多个小写ASCII字母到组1中,它将包含这些字母的整个块,而([a-z])*
将匹配并捕获0个或更多个后续小写字母的出现ASCII字母,同时用新的字母覆盖每个先前的事件。
如果您不使用冗余捕获组,也可以考虑删除它们。
更多信息,因为这是一个非锚定的替换,请注意[a-z]*
将始终匹配chol
,第二个替代将永远不会匹配。您可以考虑将(chol)
作为第一个替换,因为更具体。
所以,我建议
$pattern = "#(chol)|([a-z]*)#";