У меня строка вроде
$string = "string_key::%foo%:%bar%";
, и массив параметров
$params = array("foo" => 1, "bar" => 2);
Как заменить эти параметры в $ string pattern? Ожидаемый результат
string_key::1:2
Во-первых, вам нужно переписать массив $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);
Просмотр вывода на Codepad
В личной заметке я сделал это:
$string = "string_key::%foo%:%bar%"; $params = array("%foo%" => 1, "%bar%" => 2); $output = strtr($string, $params);
Вам не нужно ничего делать, потому что если в массиве есть какое-то значение, или строка не заменяется и игнорируется.
Быстрый и простой метод замены шаблонов.
Я не уверен, что будет самым быстрым решением для вас (это зависит от размера строки и количества замещающих значений, которые вы будете использовать).
Обычно я использую эту функцию для выполнения параметризованных замен. Он использует preg_replace_callback
и закрытие для выполнения замены для каждого процента закрытого слова.
function replaceVariables($str, $vars) { // the expression '/%([az]+)%/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%'
в вашей последней строке.