将 preg_replace 转换为 preg_replace_callback 以使用变量查找和替换单词

Converting preg_replace to preg_replace_callback for finding and replacing words with variables

我有下面一行代码:

$message = preg_replace('/\{\{([a-zA-Z_-]+)\}\}/e', "$", $body);

这会将两个花括号中的单词替换为同名变量。即 {{username}} 被替换为 $username.

我正在尝试将其转换为使用 preg_replace_callback。到目前为止,这是我基于谷歌搜索的代码,但我不太确定我在做什么! error_log 输出显示包含大括号的变量名称。

$message = preg_replace_callback(
    "/\{\{([a-zA-Z_-]+)\}\}/",
        function($match){
            error_log($match[0]);
            return $$match[0];
        },
        $body
);

非常感谢任何帮助。

函数在 PHP 中有自己的变量作用域,因此您尝试替换的任何内容在函数内部都不可用,除非您明确指定。我建议将您的替换放在一个数组中而不是单个变量中。这有两个优点——首先,它允许您轻松地将它们放入函数范围内,其次,它提供了一个内置的白名单机制,这样您的模板就不会意外(或故意)引用不应该引用的变量暴露了。

// Don't do this:
$foo = 'FOO';
$bar = 'BAR';

// Instead do this:
$replacements = [
    'foo' => 'FOO',
    'bar' => 'BAR',
];

// Now, only things inside the $replacements array can be replaced.

$template = 'this {{foo}} is a {{bar}} and here is {{baz}}';
$message = preg_replace_callback(
    '/\{\{([a-zA-Z_-]+)\}\}/',
    function($match) use ($replacements) {
        return $replacements[$match[1]] ?? '__ERROR__';
    },
    $template
);

echo "$message\n";

这产生:

this FOO is a BAR and here is __ERROR__