Converting preg_replace to preg_replace_callback for finding and replacing words with variables

前端 未结 1 1923
隐瞒了意图╮
隐瞒了意图╮ 2021-01-28 09:05

I have the following line of code:

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

This replaces words surrounded by

相关标签:
1条回答
  • 2021-01-28 09:51

    Functions have their own variable scope in PHP, so anything you're trying to replace isn't available inside the function unless you make it explicitly so. I'd recommend putting your replacements in an array instead of individual variables. This has two advantages -- first, it allows you to easily get them inside the function scope and second, it provides a built-in whitelisting mechanism so that your templates can't accidentally (or intentionally) refer to variables that shouldn't be exposed.

    // 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 yields:

    this FOO is a BAR and here is __ERROR__
    
    0 讨论(0)
提交回复
热议问题