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