@daMage

Почему скрипт не заменяет значение в шаблоне?

И снова здравствуйте. Написал скриптик, который подставляет значения вместо переменных в шаблоне, и всё бы хорошо, да только не подставляется ничего, если переменная находится в атрибуте html элемента.
То есть,
<a href="" class="btn" href="">{$download_link}</a>
работает, а
<a href="" class="btn" href="{$download_link}">Download</a>
нет.

Сама замена происходит тут
$content = file_get_contents(self::PATH_TEMPLATE.$path);
$content = preg_replace('/\{\$(\w*)\}/e', 'isset($data["$1"]) ? $data["$1"] : ""', $content);
  • Вопрос задан
  • 2484 просмотра
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Это не шаблон, а детский лепет.
Почему-то все дети поголовно думают, что задача шаблонизатора - это только заменять переменные. О том, что это никогда не будет работать в реальной жизни, ни один из них не задумывается.

Чтобы оно заработало с минимальными изменениями, надо писать так
<a href="" class="btn" href=""><?=$download_link?>Download</a>

а регулярку выкинуть нафиг.

Или действительно поставить твиг/смарти.
Но дети, опять же, по какой-то причине боятся шаблонизаторов, как серого волка.
Ответ написан
miraage
@miraage
Старый прогер
Рекомендую использовать preg_replace_callback вместо модификатора e.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
модификатор e? вы серьезно? Используйте preg_replace_callback. Хотя по хорошему вам вообще регулярки для такой задачи не нужны.

$template = file_get_contents(self::PATH_TEMPLATE . $path);
$vars = array_combine(array_map(function ($key) {
    return '{$' . $key . '}';
}, array_keys($data)), $data);
$content = strtr($template, $vars);

хотя в случае если значение не найдено оно не будет заменять на пустую строку, но я считаю что это вообще плохая практика. Можно провести часы в дебаге и только потом обнаружить опечатку в названии переменной в шаблоне.

А вообще может стоит выкинуть эту шляпу и воспользоваться twig?

p.s. ваша регулярка к слову рабочая.
Ответ написан
Ваш ответ на вопрос

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

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