preg_match - 在匹配的字符串中获取正则表达式匹配的位置

时间:2013-06-16 06:09:02

标签: php regex preg-match match

所以我知道如果你传入PREG_OFFSET_CAPTURE标志,你会得到原始“haystack”中正则表达式匹配的索引,但是如果我想在整个匹配中得到匹配的索引呢?

简单示例:

原始字符串:"Have a <1 + 2> day today"

我的正则表达式/<1 ([+|-]) 2>/

所以在示例中我匹配1和2之间的任何符号。如果我在preg_match中使用PREG_OFFSET_CAPTURE标志执行此操作,匹配符号的索引将为10.我真的希望它返回3。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:4)

唯一的方法是将整个模式偏移量(7)减去捕获组偏移量(10):10-7 = 3

$group_offset = $matches[1][1] - $matches[0][1];

答案 1 :(得分: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
        )

)