我有像
这样的字符串$string = "string_key::%foo%:%bar%";
和params数组
$params = array("foo" => 1, "bar" => 2);
如何在$ string模式中替换此参数? 预期结果是
string_key::1:2
答案 0 :(得分:6)
首先,您需要重写$params
数组:
$string = "string_key::%foo%:%bar%";
$params = array("foo" => 1, "bar" => 2);
foreach($params as $key => $value) {
$search[] = "%" . $key . "%";
$replace[] = $value;
}
之后,您只需将数组传递给str_replace()
:
$output = str_replace($search, $replace, $string);
答案 1 :(得分:2)
就个人而言,我做了这个:
$string = "string_key::%foo%:%bar%";
$params = array("%foo%" => 1, "%bar%" => 2);
$output = strtr($string, $params);
你不需要做任何其他事情,因为如果数组中有一些值,或者字符串没有被替换和忽略。
快速简单的图案替换方法。
答案 2 :(得分:1)
我不确定什么是最快的解决方案(取决于字符串大小和您将使用的替换值的数量)。
我通常使用这种功能来执行参数化替换。它使用preg_replace_callback
和一个闭包来替换每个百分比封闭的单词。
function replaceVariables($str, $vars)
{
// the expression '/%([a-z]+)%/i' could be used as well
// (might be better in some cases)
return preg_replace_callback('/%([^%]+)%/', function($m) use ($vars) {
// $m[1] contains the word inside the percent signs
return isset($vars[$m[1]]) ? $vars[$m[1]] : '';
}, $str);
}
echo replaceVariables("string_key::%foo%:%bar%", array(
"foo" => 1,
"bar" => 2
));
// string_key::1:2
<强>更新强>
与在没有相应替换的情况下找到百分比封闭值的情况下使用str_replace()
不同。
此行确定行为:
return isset($vars[$m[1]]) ? $vars[$m[1]] : '';
如果'%baz%'
不属于$vars
,它将用空字符串替换return isset($vars[$m[1]]) ? $vars[$m[1]] : $m[0];
。但是这个:
'%baz%'
将{{1}}留在最终字符串中。