Прежде всего, несколько пояснений. Допустим, у вас есть html страница с комментариями, которые вы не хотите показывать посетителям сайта. Как их убрать? Естественно, это можно сделать с помощью любого текстового редактора 🙂 Но это не самый лучший вариант 😉
HTML комментарии помогают читать разметку во время разработки, особенно если макет страницы разбит на несколько частей. Т.е. открывающий тег может находиться в одном файле, а закрывающий – в другом. В таких случаях комментарий около закрывающего тега может действительно сэкономить ваше время.
С другой стороны, наличие таких комментариев в разметке хоть и немного, но увеличивает размер страницы, да показывать их посетителям как-то неправильно.
Общая идея
Для того, чтобы каким-то образом изменить страницу нам нужно получить доступ к её содержимому. В PHP для этого предусмотрены функции управления выводом. Они позволяют перехватить данные, которые скрипт отправляет браузеру и каким-то образом их изменить.
На практике это означает, что перед началом вывода нам нужно вызвать функцию ob_start
, и в её первом параметре указать имя функции, которая будет обрабатывать данные. А в конце скрипта нужно вызвать функцию ob_end_flush
, которая отправит данные браузеру.
Сам функция удаления комментариев из HTML разметки может выглядеть как-то так:
function removeHtmlComments($html) { return preg_replace('/<!--(.*?)-->/', '', $html); }
Как видите, в ней с помощью регулярного выражения мы заменяем HTML комментарии на пустую строку.
Идея, надеюсь, ясна. Переходим к примерам.
«Чистый» PHP
<?php ob_start('removeHtmlComments'); include 'header.php'; include 'content.php'; include 'footer.php'; ob_end_flush(); ?>
Код, конечно, будет зависеть от структуры вашего приложения, но общий принцип не меняется – создаёте буфер перед формированием страницы и затем очищаете.
Yii фреймворк
Здесь задачу можно решить несколькими способами. Я приведу один из самых простых. Добавьте в массив в файле конфигурации (main.php
) два элемента:
return array( … 'onBeginRequest' => function($event){ return ob_start(function($html) { return preg_replace('/<!--(.*?)-->/', '', $html); }); }, 'onEndRequest' => function($event){ return ob_get_flush(); } … );
Здесь используются встроенные события фреймворка – onBeginRequest
и onEndRequest
. Первое событие происходит в начале обработки запроса, второе – перед её завершением.
Примечание. Если вы планируете использовать фреймворк Yii, очень рекомендую познакомиться с событиями более подробно.
С большинством других фреймворков ситуация аналогичная. Детали реализации, конечно, будут отличаться, но если вы знаете в какой последовательности происходит обработка запроса, то сможете легко определить, где именно нужно вызвать ob_start
и ob_get_flush.
CMS (WordPress)
Многие системы управления контентом, также как и фреймворки, предоставляют возможность выполнить нужный код на разных этапах обработки запроса. Правда есть свои нюансы.
Рассмотрим в качестве примера WordPress. В большинстве случаев для решения нашей задачи будет достаточно в файл functions.php
темы добавить такой код.
function removeHtmlComments($html) { return preg_replace('/<!--(.*?)-->/', '', $html); } function bufferStart() { ob_start('removeHtmlComments'); } function bufferEnd() { ob_end_flush(); } add_action('get_header', 'bufferStart'); add_action('wp_footer', 'bufferEnd');
Здесь используются два события get_header
и wp_footer
. Такой код будет работать, но проблема в том, что оба события вызываются из файлов темы, которая может иметь произвольную структуру. Проще говоря, тема может не вызвать эти события.
В таких случаях можно использовать собственные события. Для этого нужно найти открывающий и закрывающий теги <html>.
Перед открывающим добавляем
do_action('my_theme_output_begin');
после закрывающего –
do_action('my_theme_output_end');
Теперь у нас есть два события, которые можно использовать для создания и очистки буфера.
Если есть вопросы или замечания, пишите!
Успехов!