The escape sequence \g used as a backreference may not always behave as expected.
The following numbered backreferences refer to the text matching the specified capture group, as documented:
\1
\g1
\g{1}
\g-1
\g{-1}
However, the following variants refer to the subpattern code instead of the matched text:
\g<1>
\g'1'
\g<-1>
\g'-1'
With named backreferences, we may also use the \k escape sequence as well as the (?P=...) construct. The following combinations also refer to the text matching the named capture group, as documented:
\g{name}
\k{name}
\k<name>
\k'name'
(?P=name)
However, these refer to the subpattern code instead of the matched text:
g<name>
\g'name'
In the following example, the capture group searches for a single letter 'a' or 'b', and then the backreference looks for the same letter. Thus, the patterns are expected to match 'aa' and 'bb', but not 'ab' nor 'ba'.
<?php
$patterns = [
  '/([ab])\1/',      '/([ab])\g1/',     '/([ab])\g{1}/',   '/([ab])\g<1>/',   "/([ab])\g'1'/",   '/([ab])\k{1}/',   '/([ab])\k<1>/',   "/([ab])\k'1'/",   '/([ab])(?P=1)/',  '/([ab])\-1/',     '/([ab])\g-1/',    '/([ab])\g{-1}/',  '/([ab])\g<-1>/',  "/([ab])\g'-1'/",  '/([ab])\k{-1}/',  '/([ab])\k<-1>/',  "/([ab])\k'-1'/",  '/([ab])(?P=-1)/', '/(?<name>[ab])\g{name}/',  '/(?<name>[ab])\g<name>/',  "/(?<name>[ab])\g'name'/",  '/(?<name>[ab])\k{name}/',  '/(?<name>[ab])\k<name>/',  "/(?<name>[ab])\k'name'/",  '/(?<name>[ab])(?P=name)/', ];
    
foreach ($patterns as $pat)
    echo "  '$pat',\t// " . var_export(@preg_replace($pat, 'xx', 'aa ab ba bb'), 1) . PHP_EOL;
?>