我正陷在这个问题上,
我有一个像这样的数组:
$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的内容,但也不太了解如何实现它。
谢谢!
答案 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';
答案 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更新为“无法触摸”