taral
@taral
php программист

Реализация безопасного eval. Нужны советы?

Возникла задача дать пользователям возможность писать свои шаблоны, которые потом будут рендерится. По понятным причинам дать возможность писать просто php код я не хочу, потому eval отпадает.

Сейчас склоняюсь к альтернативному языку шаблона который потом буду разбирать.

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

Реализовал это так.

к примеру есть шаблон
<b>{$title}</b><br/>
{foreach $names as $name}<br/>
 {$name}<br/>
{/foreach}<br/>


Регулярными выражениями выделяю код что между foreach повторяю его пока не закончится массив $names и заменяю через strtr {$name} на значение переменной текущей итерации цикла. С {$title} тоже только без цикла.


Но хочется немного больше возможностей. К примеру базовая работа с if else, получение свойств обьектов, возможность перебора не просто переменной, а результата выполнения метода обьекта ( {foreach$post->getUsers() as $user} ), вызов методов объектов с параметрами.


Вообщем это все что хотелось бы. Возможно у кого то будут идеи. Поскольку реализовывать этот функционал тем способом что я выбрал долго и сложно. Может есть какие то библиотеки реализующие подобный функционал.
  • Вопрос задан
  • 3018 просмотров
Пригласить эксперта
Ответы на вопрос 2
Akuma
@Akuma
Веб-программист
Ваш пример — это Smarty 3
Ответ написан
Cord
@Cord
вообще, такие задачи решает так называемый лексический анализатор
ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7#.D0.9B.D0.B5.D0.BA.D1.81.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B8.D0.B9_.D0.B0.D0.BD.D0.B0.D0.BB.D0.B8.D0.B7.D0.B0.D1.82.D0.BE.D1.80

почитайте, посмотрите.
очень полезно для расширения кругозора.

и как раз писать свой шаблонизатор с анализатором, и компилятором — очень непростая и долгая задача.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы