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}");
请注意,要将 $values
传递给匿名回调函数,您需要在 use
参数中传递它。使用 !empty($values[$m[1]])
你可以检查你的数组是否包含必要的 key-value,如果是,用它替换,如果不是,只用当前匹配值恢复匹配,$m[0]
.
请注意,您不需要在此模式中转义 {
和 }
,您可以只使用 {([^{}]*)}
来匹配 {
以外的任意数量的字符和 }
在 {
和 }
之间。如果您只对包含单词字符的子字符串感兴趣,{(\w+)}
模式可能更合适。
我从以下位置找到了这个简洁的代码: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}");
请注意,要将 $values
传递给匿名回调函数,您需要在 use
参数中传递它。使用 !empty($values[$m[1]])
你可以检查你的数组是否包含必要的 key-value,如果是,用它替换,如果不是,只用当前匹配值恢复匹配,$m[0]
.
请注意,您不需要在此模式中转义 {
和 }
,您可以只使用 {([^{}]*)}
来匹配 {
以外的任意数量的字符和 }
在 {
和 }
之间。如果您只对包含单词字符的子字符串感兴趣,{(\w+)}
模式可能更合适。