通过蒙版替换字符串图案的最快方法

时间:2013-01-21 12:06:47

标签: php

我有像

这样的字符串
$string = "string_key::%foo%:%bar%";

和params数组

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

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

string_key::1:2

3 个答案:

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

View output on Codepad

答案 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}}留在最终字符串中。