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

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

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

Сообщение Slash » Сб авг 01, 2015 3:48 pm

Здравствуйте.
Работая над одним 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); 

Этот код рабочий и не является устаревшим.
Спасибо за внимание.
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

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

Сообщение Slash » Вс авг 02, 2015 7:18 am

Если в подключенном шаблоне есть ещё одно подключение, оно выйдет на экран, как текст 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;
                

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

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость