在preg_replace中替换为动态变量

时间:2018-08-21 11:10:43

标签: php regex

我正陷在这个问题上,

我有一个像这样的数组:

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

还有这样的字符串示例:

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

问题很明显,用John代替姓名,用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的内容,但也不太了解如何实现它。

谢谢!

4 个答案:

答案 0 :(得分:2)

wp-config.php接受数组作为正则表达式和替换数组,因此您可以使用以下更简单的方法:

preg_replace

输出:

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

// create array of regex using array keys
$rearr = array_map(function($k) { return '/\[\[' . $k . ']]/'; },
         array_keys($array));

# pass 2 arrays to preg_replace
echo preg_replace($rearr, $array, $string) . '\n';

PHP Code Demo

答案 1 :(得分:2)

您可以像这样使用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 demo

详细信息

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

答案 2 :(得分:1)

您可以尝试一下,

$array = ['name' => 'John', 'email' => 'john@gmail.com'];
$string = 'Hi [[name]], your email is [[email]]';
$stringHasBrackets = preg_match_all('/\[\[(.*?)\]\]/i', $string,  $matchOutput);

if ($stringHasBrackets) {
    $newString = $string;
    foreach ($matchOutput[1] as $matchOutputKey => $stringToBeReplaced) {
        if (array_key_exists($stringToBeReplaced, $array)) {
            $newString = preg_replace("/\[\[$stringToBeReplaced\]\]/i", $array[$stringToBeReplaced], $newString);
        }
    }
    echo $newString;
}

答案 3 :(得分:1)

我认为这里更简单地是使用str_replace函数,例如:

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

$string = 'Hi [[name]], your email is [[email]]';
$string = str_replace(array_map(function ($v) {return "[[{$v}]]";}, 
                      array_keys($array)), $array, $string);
echo $string;

已将$ array更新为“无法触摸”