php - 用 preg_replace 中的动态变量替换
问题描述
我陷入了这个问题,这是
我有一个这样的数组:
$array = [
'name' => 'John',
'email' => john@gmail.com
];
和这样的字符串示例:
$string = 'Hi [[name]], your email is [[email]]';
问题很明显,将 name 替换为 ,将John
email替换为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_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
值。如果找到,则返回该值,否则,将找到的匹配项粘贴回去。
推荐阅读
- ios - 如何防止按钮在文本更改时移动?
- android - 使用 joda time 时在 ci 上测试失败
- javascript - ReactJS:“this.props.addDog(this.state.newDog);”是什么意思?在这段代码中是什么意思?
- postgresql - 如何将 pq.Int64Array 转换为字符串?
- parallel-processing - 查找可用于处理的最大内核数
- android - Flutter - 使用正则表达式验证电话号码
- r - 内联平方转换给出与转换后的列值不同的结果
- c# - GraphQL .net 实体框架中的 KeyNotFoundException
- javascript - 添加复选框值在显示时不适用于隐藏的“div”
- php - 生成动态 if 条件的 PHP Eval 替代方案