DANFA

Получить содержимое файла используя регулярные выражения в PHP

PHP
Работая над одним php сценарием (парсер, шаблонизатор), делал замену кода в шаблонах используя регулярные выражения, вот так:
        $cache_tpl = preg_replace('/\{echo (.*?)}/', '<?php echo $1; ?>', $cache_tpl);

По моему данная конструкция отлично справляется со своей работай. Код, что я привел для примера находит в шаблоне {echo $...} и заменяет его на:
<?php echo $...; ?>

Далее измененный код сохраняем в файл кэша, и уже из кэша выводим на экран.
Все просто и понятно, но когда я дошел до подключения шаблона в шаблоне столкнулся с тем, что такой код вовсе не пролезет:
        $cache_tpl = preg_replace('/\{include (.*?)}/', '<?php include $1; ?>', $cache_tpl);

этот код не будет работать. То есть он будет работать, но подключать указанный шаблон он не будет.
Тут я подумал, что можно не подключать шаблон каждый раз (в кэше), а получить содержимое подключаемого шаблона и вставить это содержимое вместо {include ...} и все! Код написал так:
        $cache_tpl = preg_replace('/\{include (.*?)}/', file_get_contents($1), $cache_tpl); 

Но такой код не работал, а выдавал ошибку. Немного поэкспериментировав сделал так:
        $cache_tpl = preg_replace('/\{include (.*?)}/e', 'file_get_contents("$1")', $cache_tpl); 

Этот код работает, так как мне надо! Я добился своего. Но вскоре на официальном сайте php я прочитал, что модификация e, которую я использую в своем выражении устарело и её использование небезопасно. Стал проводить эксперименты и искать альтернативу дальше.
Верным решением было использовать функцию preg_replace_callback() вместо preg_replace(). Функцию preg_replace_callback() - ищет по регулярному выражению и изменяет используя функцию обратного вызова. Вот что получилось в итоге:
        # Обработка INCLUDE 
        $cache_tpl = preg_replace_callback('/\{include (.*?)}/',
            function($include_tpl)
            {            
                return file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl);
            },  
        $cache_tpl); 

Этот код рабочий и не является устаревшим.

Если в подключенном шаблоне есть ещё одно подключение, оно выйдет на экран, как текст include, а не как содержимое подключенного шаблона. Что бы не вышло лишнего на экран делаем так:
                return file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl); 

заменить на:
                $include_tpl = file_get_contents($dir_tpl . $include_tpl[1] . $ext_tpl); 
                if (preg_match('/\{include (.*?)}/', $include_tpl))
                {
                    return preg_replace('/\{include (.*?)}/', null, $include_tpl);
                }
                else
                {
                    return $include_tpl;
                } 

Теперь все лишние подключения не попадут на экран пользователя.
Хотя лучше, конечно убирать лишнее из самого кода, а не пытаться спрятать...