Помните, что вы не можете использовать $ vars, не вводя at с глобальным ключевым словом или не используя $ GLOBALS. Также, если вы используете PHP 5.3, вы можете использовать анонимную функцию без уродливого глобального взлома:
$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', function($matches) use ($vars) { return $vars[$matches[1]]; }, $template);
В pre-5.3 вы можете сделать это:
$template = preg_replace_callback('/<!--\s+\*(\w+)\*\s+-->/', create_function('$matches', 'return $GLOBALS["vars"][$matches[1]];'), $template);
Если вы не запускаете 5.3, но по-прежнему хотите избежать глобальной переменной, вы можете сделать это:
$template = preg_replace('/<!--\s+\*(\w+)\*\s+-->/e', '$vars["\1"]', $template);