名前空間のクラス名を置き換えることを意図した正規表現から予期しない結果が得られます。置換が 2 回行われたように見えるため、置換されるクラス名が重複しています (以下の例を参照)。
+
実際には、正規表現を0以上 ( ) ではなく 1 以上 ( ) に一致するように変更することで問題を解決しました*
。これは、実際には必要なものに対してより正確です。
しかし、そもそもなぜ問題が発生したのか、少し混乱しています。
問題の例を次に示します。
$classns = 'components\groups\GroupsController';
$newclass = 'GroupsAccess';
$classns = preg_replace('/[^\\\\]*$/', $newclass, $classns);
echo $classns;
結果
components\groups\GroupsAccessGroupsAccess
期待される
components\groups\GroupsAccess
* が単語境界またはその性質のものと一致している可能性はありますか?
私にとって紛らわしい部分は、同じ正規表現を使用した preg_match が 1 つの結果しか表示しないため、preg_match が正規表現を実行する方法に固有のもののように見えることです。
例えば
preg_match('/[^\\\\]*$/', $classns, $m);
var_dump($m);
結果
array(1) { [0]=> string(12) "GroupsAccess" }