PHP preg_match 模板数组作为第二个参数不起作用

PHP preg_match template array as a second argument not working

我从以下位置找到了这个简洁的代码:https://www.webmasterworld.com/php/3444822.htm

第一个例子似乎运行良好:

$firstname = "Eric";
$lastname = "Johnsson";
echo preg_replace("/\{([^\{]{1,100}?)\}/e", "$", "{lastname}, {firstname}");

但是当我尝试使用第二个数组版本时,无论我尝试什么组合,它都会给我索引和其他错误:

$values = array('firstname'=>'Eric', 'lastname'=>'Johnsson');
echo preg_replace("/\{([^\{]{1,100}?)\}/e", "$values[]", "{lastname}, {firstname}");

在 PHP 5.5 倍 "should" 中工作。 PHP 7.x -> 需要第二个参数是一个函数,不接受正则表达式上的 -e 参数。

有谁知道第二个版本的有效解决方案吗?我宁愿不使用导出函数将变量提取到工作范围。

您需要使用 preg_replace_callback,如下面的代码所示:

$values = array('firstname'=>'Eric', 'lastname'=>'Johnsson');
echo preg_replace_callback("/{([^{}]*)}/", function($m) use ($values) {
    return !empty($values[$m[1]]) ? $values[$m[1]] : $m[0];
}, "{lastname}, {firstname} {somestring}");

PHP demo

请注意,要将 $values 传递给匿名回调函数,您需要在 use 参数中传递它。使用 !empty($values[$m[1]]) 你可以检查你的数组是否包含必要的 key-value,如果是,用它替换,如果不是,只用当前匹配值恢复匹配,$m[0].

请注意,您不需要在此模式中转义 {},您可以只使用 {([^{}]*)} 来匹配 { 以外的任意数量的字符和 }{} 之间。如果您只对包含单词字符的子字符串感兴趣,{(\w+)} 模式可能更合适。