Как заменить заполнители фактическими значениями?

Мне нужна функция, которая заменяет каждое имя переменной внутри '{}' правильной переменной. Что-то вроде этого:

$data["name"] = "Johnny"; $data["age"] = "20"; $string = "Hello my name is {name} and I'm {age} years old."; $output = replace($string, $data); echo $output; //outputs: Hello my name is Johnny and I'm 20 years old. 

Я знаю, что для этого есть фреймворк / движки, но я не хочу устанавливать для них кучу файлов.

Вы можете сделать это наиболее легко с помощью /e модификатора preg_replace :

 $data["name"] = "Johnny"; $data["age"] = "20"; $string = "Hello my name is {name} and I'm {age} years old."; echo preg_replace('/{(\w+)}/e', '$data["\\1"]', $string); 

Смотрите в действии .

Вы можете настроить шаблон, который соответствует строкам замены (который здесь {\w+} : один или несколько буквенно-цифровых символов или подчеркивание между фигурными скобками). Включение его в функцию тривиально.

Ну вот:

 $data["name"] = "Johnny"; $data["age"] = "20"; $string = "Hello my name is {name} and I'm {age} years old."; foreach ($data as $key => $value) { $string = str_replace("{".$key."}", $value, $string); } echo $string; 

Возможно, вам стоит взглянуть на функцию preg_replace .

 $string = "Hello my name is {$data["name"]} and I'm {$data["age"]} years old."; 

будет делать то, что вы хотите. Если вам не подходит, попробуйте что-то вроде цикла с регулярным выражением, как это

 for ($data as $key=>$value){ $string = preg_replace("\{$key\}", $value, $string); } 

Не тестировалось, вы можете проконсультироваться с документацией.

Вы можете попробовать vsprintf он имеет несколько иной синтаксис

 $string = 'hello my name is %s and I am %d years old'; $params = array('John', 29); var_dump(vsprintf($string, $params)); //string(43) "hello my name is John and I am 29 years old" 

Я всегда был поклонником strtr .

 $ php -r 'echo strtr("Hi @name. The weather is @weather.", ["@name" => "Nick", "@weather" => "Sunny"]);' Hi Nick. The weather is Sunny. 

Другим преимуществом этого является то, что вы можете определить разные типы префикса-заполнителя. Вот как это делает Drupal; @ указывает строку, которая должна быть экранирована как безопасная для вывода на веб-страницу (чтобы избежать инъекций). Команда format_string пересекает ваши параметры (такие как @name и @weather ), и если первый символ является @ , то он использует check_plain для значения.

Также здесь ответил: https://stackoverflow.com/a/36781566/224707