2

これは、 PCRE条件付きサブパターンに関するPHPマニュアルからのものです。

条件付きサブパターンの2つの可能な形式は次のとおりです。
(?(condition)yes-pattern)
(?(condition)yes-pattern|no-pattern)

条件が数字またはアサーションである限り、それは問題ありません。しかし、私は次のことをよく理解していません

条件が文字列(R)の場合、パターンまたはサブパターンへの再帰呼び出しが行われた場合に満たされます。「トップレベル」では、条件はfalseです。(...)条件が数字のシーケンスまたは(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) は再帰を表します。これを使用する良い例を次に示します。

再帰パターン

condition(?R)として使用されているか、それが使用できる状況でさえ、または少なくとも私の理解では使用されていないかどうかはわかりません。しかし、プログラミングでは毎日新しいことを学びます。

真または偽のステートメントとして非常に簡単に使用できます。

これに従って:

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

(?R)虚偽のステートメントでas が使用されている場合。山括弧内のテキストに一致し、任意のネストを可能にします。ネストされた大括弧 (つまり、再帰の場合) では数字のみが許可されますが、外側のレベルではすべての文字が許可されます。

これがあなたが探している答えではないことはわかっています....あなたは今、これを調査するためのクエストで私を送ってきました。

于 2013-01-11T22:15:47.163 に答える