首页 > 解决方案 > 用 preg_replace 中的动态变量替换

问题描述

我陷入了这个问题,这是

我有一个这样的数组:

$array = [
    'name' => 'John',
    'email' => john@gmail.com
];

和这样的字符串示例:

$string = 'Hi [[name]], your email is [[email]]';

问题很明显,将 name 替换为 ,将Johnemail替换为john@gmail.com.

我尝试了什么:

//check if $string has [[ ]] pattern

$stringHasBrackets = preg_match_all('/\[\[(.*?)\]\]/i', $string,  $matchOutput);

if ($stringHasBrackets) {

    foreach ($matchOutput[1] as $matchOutputKey => $stringToBeReplaced) {

        if (array_key_exists($stringToBeReplaced, $array)) {

            $newString = preg_replace("/\[\[(.+?)\]\]/i",
                            $array[$stringToBeReplaced],
                            $string);

        }
    }
}

这让我想到了一个像这样的新字符串:

Hi john@gmail.com, your email is john@gmail.com

有道理,因为这就是模式的用途,但不是我想要的。

我该如何解决这个问题?我想过在模式中使用一个变量,但不知道该怎么做。我读过关于 preg_replace_callback 但也不知道如何实现它。

谢谢!

标签: phpregex

解决方案


你可以preg_replace_callback这样使用:

$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';
echo preg_replace_callback('/\[\[(.*?)]]/', function ($m) use ($array) {
        return isset($array[$m[1]]) ? $array[$m[1]] : $m[0]; 
    }, $string);

请参阅PHP 演示

细节

  • '/\[\[(.*?)]]/'匹配[[...]]将括号内的内容放入第 1 组的子字符串
  • $m持有匹配对象
  • use ($array)允许回调访问$array变量
  • isset($array[$m[1]])检查变量中是否存在与找到的键对应的$array值。如果找到,则返回该值,否则,将找到的匹配项粘贴回去。

推荐阅读