在PHP中命名正则表达式返回引用

时间:2015-04-18 20:50:34

标签: php regex pcre backreference

使用PHP 5.5+正则表达式,我想使用命名反向引用来捕获一个组。

例如,我希望以下文字匹配:

1-1
2-2

但不是以下

8-7

但是,当我尝试使用反向引用时,PHP会将其标记为匹配:

/* This statement evaluates to 1 */
preg_match("/(?<one>[1-9])\-(?<two>\\g<one>)/", "8-7");

除了使用带编号的引用之外,还有其他解决方法吗?

1 个答案:

答案 0 :(得分:2)

请参阅PCRE documentation的摘录:

  

为了与Oniguruma兼容,非Perl语法\g后跟   用尖括号或单引号括起来的名称或数字,   是一种替代语法,用于将子模式引用为   子程序,可能是递归的。

     

请注意\g{...}(Perl语法)和\g<...>(Oniguruma语法)   不是同义词。前者是后参考;后者是一个   子程序调用。

使用\g<one>,您不会引用匹配,而是引用子模式,请参阅regex101.com上的说明。

  

\g<one>递归名为one

的子模式

您需要使用\1来实际匹配第一组中捕获的相同文本。

(?<one>[1-9])\-(?<two>\1)

或(对实际文本的命名反向引用),

(?<one>[1-9])\-(?<two>\g{one})
  

\1匹配与第一次捕获最近匹配的文本相同的文本   组

请参阅a numbered demonamed back-reference demo