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 回答