PHP用数组变量替换字符串中的{var ['key']}

时间:2017-08-02 20:14:47

标签: php regex replace preg-replace

我不仅要替换简单变量,还要替换数组。 关于简单变量的替换有answer Alex Howansky

$str = 'this is {TEST} a {THING} to test and a {array["key"]} var';

$TEST = 'one';
$THING = 'two';

$result = preg_replace('/\{([A-Z]+)\}/e', "$$1", $str);

{TEST}和{THING}的工作正常。

对于数组的调用变量变量,我需要${$array}['key']https://stackoverflow.com/a/20216265/1056384)。所以我试着做第二遍:

$result = preg_replace('/\{([a-z]+)\["([a-z]+)"\]\}/', "$\{$$1\}["$2"]", $result);

但是在输出中我得到字符串$\{$array\}["key"]而不是$ array [“key”]的值。

如何用数组变量替换模板中的子串?

1 个答案:

答案 0 :(得分:1)

我无法通过preg_replace正确解析它,所以我使用了回调:

$str = 'this is {TEST} a {THING} to test and a {array["key"]} var';

$array['key'] = 'something';

$result = preg_replace_callback('/\{([a-z]+)\["([a-z]+)"\]\}/',
                                function($m) use($array){
                                    return ${$m[1]}[$m[2]];
                                },
                                $str);

如果您不知道要传递给函数的数组的名称,您需要确保它在全局范围内定义,然后以这种方式访问​​它:

$result = preg_replace_callback('/\{([a-z]+)\["([a-z]+)"\]\}/',
                                function($m) {
                                    ${$m[1]} = $GLOBALS[$m[1]];
                                    return ${$m[1]}[$m[2]];
                                },
                                $str);