PRIG_REPLACE双替换
我从正则表达式中得到了一些意外的结果,它应该替换命名空间上的类名。替换似乎发生了两次,因此要替换的类名是重复的(请参见下面的示例)。
我实际上已通过将reg ex更改为匹配1或更多(+
)而不是0或更多(*
)来解决问题,这实际上更符合我的要求。
但是,我有点困惑,不知道为什么我一开始就会遇到问题。
以下是该问题的一个示例:
$classns = 'componentsgroupsGroupsController';
$newclass = 'GroupsAccess';
$classns = preg_replace('/[^\\]*$/', $newclass, $classns);
echo $classns;
结果
componentsgroupsGroupsAccessGroupsAccess
预期
componentsgroupsGroupsAccess
*是否可能与单词边界或类似性质匹配?
令我困惑的是,使用相同正则表达式的preg_match只显示一个结果,因此它似乎特定于preg_match如何运行正则表达式。
例如
preg_match('/[^\\]*$/', $classns, $m);
var_dump($m);
结果
array(1) { [0]=> string(12) "GroupsAccess" }
解决方案
*
与单词边界不匹配,它与空字符串匹配。
您的表达式首先匹配
组件组组控制器
$
是与某个位置匹配且位于字符串末尾之前的锚点(或字符串末尾之前的
)。
因此,在第一次匹配之后,正则表达式解析器的位置在最后一个"r"之后,字符串末尾之前,当它再次尝试匹配您的正则表达式时。并且它将再找到/
(空字符串)后面跟着字符串末尾的匹配==>0个匹配项。
然后它继续前进,识别字符串末尾并完成。
相关文章