1

したがって、フラグ PREG_OFFSET_CAPTURE を渡すと、元の「干し草の山」で正規表現一致のインデックスが取得されることはわかっていますが、一致全体の中で一致のインデックスが必要な場合はどうすればよいでしょうか?

簡単な例:

元の文字列:"Have a <1 + 2> day today"

私の正規表現/<1 ([+|-]) 2>/

したがって、この例では、1 と 2 の間の任意のシンボルを照合しています。preg_match で PREG_OFFSET_CAPTURE フラグを使用してこれを行った場合、一致したシンボルのインデックスは 10 になります。ただし、3 を返すことを本当に望んでいます。

これを行う方法はありますか?

4

2 に答える 2

4

唯一の方法は、パターン オフセット全体 (7) をキャプチャ グループ オフセット (10) から差し引くことです: 10-7=3

$group_offset = $matches[1][1] - $matches[0][1];
于 2013-06-16T06:15:53.330 に答える
1

次を使用して、よりトリッキーな方法を使用できますpreg_replace_callback

$string = 'I have a <1 + 2> day today and a foo <4 - 1> week.';
$match = array();

preg_replace_callback('/<\d+ ([+|-]) \d+>/', function($m)use(&$match){
    $match[] = array($m[0], $m[1], strpos($m[0], $m[1]));
}, $string); // PHP 5.3+ required (anonymous function)
print_r($match);

出力:

Array
(
    [0] => Array
        (
            [0] => <1 + 2>
            [1] => +
            [2] => 3
        )

    [1] => Array
        (
            [0] => <4 - 1>
            [1] => -
            [2] => 3
        )

)
于 2013-06-16T07:56:30.140 に答える