VANHALEN
Ну предположим, перечислять нигде ничего не надо. Достаточно вытаскивать список переменных из шаблона, а не из входных данных.
Берешь ты, допустим, preg_replace_callback с регуляркой вида /%([\d\w_]+)%/ и $1 в callback-функции меняешь на $vars[$1], где $vars - твои переменные шаблона.
Потом ты хочешь добавить простое условие - показать или скрыть такой-то блок в зависимости от того, передана ли в шаблон переменная (банально: подставить урл картинки в тэг img, но если урл не задан - вообще не выводить img). Если ты сейчас передаешь в качестве переменной для подстановки целиком тег img извне, поздравляю, ты сделал феерично неудобную фигню. Ну да ладно вот захотел ты, добавляешь какой-то { if var } ... { end }, начинаешь возиться с регулярками, и уже получается как-то очень сложно, черт уже в этих регулярках ногу сломит.
Тут тебе приходит в голову. Ведь можно просто заменять наши процентики на php инструкции:
%var% -> <? if (isset($vars['var'])) print $vars['var'] ?>
{ if var } .. { end } -> <? if (!empty($vars['var'])) : ?> .... <? endif ?>
итд.
Делаешь на это евал, тормозааа. Думаешь, а почему бы не делать этот пхп код заранее и не кэшировать его в файл, которому просто делать include.
И тут я тебя поздравляю ты изобрел smarty
Здесь теперь есть 2 подхода - либо делать как смарти, либо ручками писать прямо-таки пхп код. Этот вопрос холиварный и занимает этот форум уже лет 10, но факт в том что это два основных нормальных способа делать шаблоны )