Как сделать замену токенов в строке по ключам из массива?

$array = array('user'=>'Петя','time'=>'45','what'=>'Хорошо');
$message = '[user] любит прыгать на батуте [time] минут.  Это очень [what]';


Как получить текст?:
Петя любит прыгать на батуте 45 минут. Это очень Хорошо

Надо ob_start(); и ob_end_flush(); использовать?
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
0xD34F
@0xD34F
echo preg_replace_callback('~\[(.+?)\]~', fn($m) => $array[$m[1]] ?? $m[0], $message);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@polak228
<?php
namespace Project;


interface TemplateEngineInterface {
    public function render(string $template, array $values) : string;
}

abstract class TemplateEngineAbstract {
    abstract public function __construct(array $deviders = ["[", "]"]);
    abstract public function render(string $template, array $values) : string;
}

class TemplateEngine extends TemplateEngineAbstract implements TemplateEngineInterface {

    private array $deviders;

    public function __construct(array $deviders = ["[", "]"]) {
        $this -> deviders = $deviders;
    }

    public function render(string $template, array $values) : string {
        foreach($values as $key => $value) {
            $templateKey = $this -> deviders[0] . $key . $this -> deviders[1];
            $template = str_replace($templateKey, $value, $template);
        }
        return $template;
    }

}


$message = "[user] любит прыгать на батуте [time] минут. Это очень [what].";
$array = [
    "user" => "Петя",
    "time" => 45,
    "what" => "хорошо"
];

$engine = new TemplateEngine();
$templated = $engine -> render($message, $array);
echo $templated;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы