作為反向參考使用的跳脫序列 \g 可能不會總是如預期般運作。
以下編號的反向參考是指符合指定擷取群組的文字,如文件中所述
\1
\g1
\g{1}
\g-1
\g{-1}
然而,以下變體指的是子模式程式碼,而不是匹配的文字
\g<1>
\g'1'
\g<-1>
\g'-1'
對於具名反向參考,我們也可以使用 \k 跳脫序列以及 (?P=...) 結構。以下組合也指的是符合命名擷取群組的文字,如文件中所述
\g{name}
\k{name}
\k<name>
\k'name'
(?P=name)
然而,這些指的是子模式程式碼,而不是匹配的文字
\g<name>
\g'name'
在以下範例中,擷取群組搜尋單個字母「a」或「b」,然後反向參考搜尋相同的字母。因此,預期模式會匹配「aa」和「bb」,但不匹配「ab」或「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;
?>