9

我有类似的字符串

$string = "string_key::%foo%:%bar%";

, 和参数数组

$params = array("foo" => 1, "bar" => 2);

如何在 $string 模式中替换此参数?预期结果是

string_key::1:2
4

3 回答 3

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);

在键盘上查看输出

于 2013-01-21T12:11:40.750 回答
2

就个人而言,我做了这个:

$string = "string_key::%foo%:%bar%";
$params = array("%foo%" => 1, "%bar%" => 2);
$output = strtr($string, $params);

您不必做任何其他事情,因为如果数组中有一些值或字符串不会被替换和忽略。

快速简单的模式替换方法。

于 2014-04-07T15:26:47.047 回答
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%'在你的最后一串。

于 2013-01-21T12:39:45.240 回答