2

这是来自关于 PCRE 条件子模式的 PHP手册:

条件子模式的两种可能形式是:
(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)

只要条件是数字或断言就可以了。但我不太明白以下内容

如果条件是字符串 (R),则如果对模式或子模式进行了递归调用,则满足条件。在“顶级”,条件为假。(...) 如果条件不是数字序列或 (R),则它必须是断言。

如果有人能举例说明条件子模式中的 (R) 是什么以及如何使用它,我将不胜感激。提前致谢。

4

3 回答 3

3

作为一个额外且更清晰的答案……</p>

2 天前,我正在编写一个匹配 IPv4 地址的模式,我发现自己使用条件递归,所以我认为我应该分享(因为它比想象的例子更有意义)。

~
(?:(?:f|ht)tps?://)?            # possibly a protocol
(
    (?(R)\.)                    # if it\'s a recursion, require a dot
    (?:                         # this part basically looks for 0-255
        2(?:[0-4]\d|5[0-5])
        | 1\d\d
        | \d\d?
    )
)(?1){3}                        # go into recursion 3 times
                                # for clarity I\'m not including the remaining part
~xi
于 2013-01-24T03:50:50.963 回答
1

据我了解(从递归作为子模式中的条件),这是一个非常基本的示例。

$str = 'ds1aadfg346fgf gd4th9u6eth0';
preg_match_all('~(?(R).(?(?=[^\d])(?R))|\d(?R)?)~'
/*
(?                          # [begin outer cond.subpat.]
    (R)                     # if this is a recursion               ------> IF
    .                       # match the first char
    (?                      # [begin inner cond.subpat.]
        (?=[^\d])           # if the next char is not a digit
            (?R)            # reenter recursion
    )                       # [end inner cond.subpat.]
    |                       # otherwise                             -----> ELSE
    \d(?R)?                 # match a digit and enter recursion (note the ?)
)                           # [end outer cond.subpat.]
*/
,$str,$m);
print_r($m[0]);

和输出:

Array
(
    [0] => 1aadfg
    [1] => 34
    [2] => 6fgf gd
    [3] => 4th
    [4] => 9u
    [5] => 6eth
    [6] => 0
)

我知道这是一个愚蠢的例子,但我希望它是有道理的。

于 2013-01-13T03:11:23.183 回答
0

(R) 代表递归。这是使用它的一个很好的例子。

递归模式

不确定我曾经见过(?R)used 作为condition,甚至是可以使用的情况,或者至少在我的理解中没有。但是你每天都会在编程中学习新东西。

它可以很容易地用作真假陈述。

按照这个:

< (?: (?(R) \d++  | [^<>]*+) | (?R)) * >

(?R)在虚假陈述中使用as的地方。匹配尖括号中的文本,允许任意嵌套。嵌套括号中只允许使用数字(即递归时),而外层允许使用任何字符。

我知道这不是你要找的答案……你现在派我去研究这个。

于 2013-01-11T22:15:47.163 回答