使用preg_replace_callback
,是否可以只替换一个回溯引用?还是我得把所有的东西都还回去?
我只是想用引号将令牌的默认值括起来。
$str = 'This is a {$token|token was empty}';
$str = preg_replace_callback('~{\$\w+\|(.*)?}~i', function($match) {
//$match[1] is "token was empty"
//I want to just replace $match[1], but it needs me to return the whole thing
}, $str);
我必须抓取更多的反向引用,这样我就可以建立一个新的令牌版本,并返回,我不能只是取代回溯1?谢谢。
最佳答案
我必须抓取更多的反向引用,这样我就可以建立一个新的令牌版本,并返回,我不能只是取代回溯1?
你有两个选择:
如您所说,使用额外的反向引用来构造替换字符串,或者
使用lookarounds仅匹配要替换的零件。
通常我建议使用第一种方法,因为第二种方法效率较低,并且在某些情况下会导致无效匹配(当前瞻和后面可以重叠)。在这种情况下,这是没有问题的。
第二种选择的例子是:
preg_replace_callback('~{\$\w+\|\K(?:[^{}]+)?(?=})~i', function($match){
// $match[0] contains what used to be the first capturing group.
// return the value you want to replace it with
// (you can still use the capturing group if you want, but it's unnecessary)
});
\K
是一种将之前的所有内容从实际匹配中排除的方法(就像后面有一个可变长度的查找一样)。(?=})
是一个展望,表示以下内容必须是一个}
但不包括在match it self中。