1

假设我们有以下表达式

(?x) ((a  b) (c) | (d) (e f) | (g) h (i) )

我们将获得以下反向引用:

\1 abc, def, ghi
\2 ab
\3 c
\4 d
\5 ef
\6 g
\7 i

Notepad++ 正则表达式引擎支持一个奇妙的构造:

(?|expression using the alternation | operator)

该表达式使子表达式 counter 不会被交替的其他分支中的内容更改。它工作得很好。所以

(?x) (?| (a  b) (c) | (d) (e f) | (g) h (i) )

创建以下组

\1 ab, d, g
\2 c, ef, i

但是当我尝试在 PHP 中使用这个结构时,我得到了一个错误。

警告:preg_match_all():编译失败:在 (? 或 (?- 在偏移 11 处 ...

那么,在 PHP 中是否可以为交替的不同分支使用相同的编号(如前面提到的构造)?


解决方案

问题是我在“?”之间放了一个换行符。和 '!'。我使用了 'x' 修饰符,并认为可以在表达式中的任何位置使用换行符。但事实证明你不能打破“?|” 部分不管使用的修饰符。

4

1 回答 1

3

PCRE 中子模式的文档说它是受支持的。该页面底部有一个示例。

编辑:刚刚在 PHP 5.3.15 中尝试过,它可以工作。

于 2012-12-08T19:03:08.640 回答