[英]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
您可以像这样使用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.