PRIG_REPLACE双替换

2022-03-22 00:00:00 regex php preg-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个匹配项。

然后它继续前进,识别字符串末尾并完成。

相关文章