Самый быстрый способ заменить шаблоны строк по маске

У меня строка вроде

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

, и массив параметров

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

Как заменить эти параметры в $ string pattern? Ожидаемый результат

 string_key::1:2 

Related of "Самый быстрый способ заменить шаблоны строк по маске"

Во-первых, вам нужно переписать массив $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%' в вашей последней строке.