Php 替换为preg_Replace中的动态变量
我被这个问题难住了 我有这样一个数组:Php 替换为preg_Replace中的动态变量,php,regex,Php,Regex,我被这个问题难住了 我有这样一个数组: $array = [ 'name' => 'John', 'email' => john@gmail.com ]; $string = 'Hi [[name]], your email is [[email]]'; Hi john@gmail.com, your email is john@gmail.com $array = ['name' => 'John', 'email' => 'john@gmail.
$array = [
'name' => 'John',
'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$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);
下面是一个字符串示例:
$array = [
'name' => 'John',
'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$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);
问题很明显,用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);
}
}
}
这让我找到了这样一个新字符串:
$array = [
'name' => 'John',
'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$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);
这很有意义,因为这是模式的目的,但不是我想要的
我怎样才能解决这个问题?我想在模式中使用一个变量,但不知道怎么做。我读过preg_replace_回调,但也不知道如何实现它
谢谢
preg\u replace
接受数组作为regex和replacement,因此您可以使用这种更简单的方法:
$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
您可以这样使用:
$array = [
'name' => 'John',
'email' => john@gmail.com
];
$string = 'Hi [[name]], your email is [[email]]';
Hi john@gmail.com, your email is john@gmail.com
$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);
看
详细信息
匹配'/\[\[(.*)]]/'
子字符串,将括号内的内容放入组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\u 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为“不可触及”不错的答案+1@DuongNguyen,但因为运行regex是一项非常昂贵的操作。我将包含一个if来检查字符串是否包含替换模板,检查
[[
和]
参见演示。。更好的是,我没有能力做一次感谢。我们将对preg_replace_回调进行研究,如果可行,我们将与您联系@RaymondNijland我用preg_match_all检查了字符串,可以吗?“我用preg_match_all检查了字符串,可以吗?”@duongguyenpreg_match_all
仍然使用正则表达式现在你启动了两个正则表达式引擎。@RaymondNijland我明白了。这可能比使用正则表达式简单得多,但我不允许触摸数组,array_keys返回一个数组,那么我可以将[[和]]连接到它吗?另外,我想用数组值替换字符串中的数组_键($array)。请参阅更新版本-在这种情况下,我们还需要数组_映射
。是的,它会在字符串中搜索修改过的键,并用数组值替换。谢谢你,Agnius!谢谢这很有魅力。我不是一个正则表达式向导,但你怎么知道把变量放在哪里?@DuongNguyen,谢谢:)我要做另一项关于使用数组映射的研究:Darray\u映射
用于将每个键转换成正则表达式。因此,name
变成了/\[\name]/
@bobblebble:没错,array\u值
是不需要的。