php 在preg_replace_callback()的回调函数中访问当前匹配的偏移量

roejwanj  于 2023-06-04  发布在  PHP
关注(0)|答案(3)|浏览(243)

如何在preg_replace_callback的回调函数中跟踪当前匹配项从字符串开始的偏移量?
例如,在这段代码中,我想指出抛出异常的匹配的位置:

$substituted = preg_replace_callback('/{([a-z]+)}/', function ($match) use ($vars) {
    $name = $match[1];

    if (isset($vars[$name])) {
        return $vars[$name];
    }

    $offset = /* ? */;
    throw new Exception("undefined variable $name at byte $offset of template");
}, $template);
0aydgbwb

0aydgbwb1#

由于标记的答案不再可用,以下是我获得当前替换索引的方法:

$index = 0;
preg_replace_callback($pattern, function($matches) use (&$index){
    $index++;
}, $content);

正如你所看到的,我们必须使用范围外的变量来维护索引。

gzjq41n4

gzjq41n42#

你可以先用preg_match_all & PREG_OFFSET_CAPTURE选项匹配,然后重建你的字符串,而不是使用默认的preg_replace方法。

rks48beu

rks48beu3#

从PHP 7.4.0开始,preg_replace_callback也接受PREG_OFFSET_CAPTURE标志,将每个匹配组转换为[text, offset]对:

$substituted = preg_replace_callback('/{([a-z]+)}/', function ($match) use ($vars) {
    $name = $match[1][0];

    if (isset($vars[$name])) {
        return $vars[$name];
    }

    $offset = $match[0][1];
    throw new Exception("undefined variable $name at byte $offset of template");
}, $template, flags: PREG_OFFSET_CAPTURE);

相关问题