如何在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);
3条答案
按热度按时间0aydgbwb1#
由于标记的答案不再可用,以下是我获得当前替换索引的方法:
正如你所看到的,我们必须使用范围外的变量来维护索引。
gzjq41n42#
你可以先用
preg_match_all
&PREG_OFFSET_CAPTURE
选项匹配,然后重建你的字符串,而不是使用默认的preg_replace
方法。rks48beu3#
从PHP 7.4.0开始,
preg_replace_callback
也接受PREG_OFFSET_CAPTURE
标志,将每个匹配组转换为[text, offset]
对: