繁体   English   中英

替换为preg_replace中的动态变量

[英]Replace with dynamic variable in preg_replace

我陷入了这个问题,这是

我有这样一个数组:

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

像这样的字符串示例:

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

问题很明显,用John替换name并用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但也不知道如何实现它。

谢谢!

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';

输出:

Hi John, your email is john@gmail.com

PHP代码演示

您可以像这样使用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变量中是否存在与找到的键对应的值。 如果找到,则返回该值,否则,将粘贴找到的匹配。

你可以试试这个,

$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;
}

我想在这里更简单的是使用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更新为“不可触及”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM