Заставить весь вывод PHP-файла проходить через "фильтрующий файл" перед отображением

Можно ли как-нибудь отфильтровать весь вывод PHP и / или HTML-файла перед его отображением в браузере? Я подумал, что мог бы передать его через глобальную функцию, прежде чем она отобразится, но я застрял в реализации. Пожалуйста помоги.

Если бы был лучший способ достичь того же результата, я был бы рад узнать.

Благодарю.

5 ответов

Решение

Проверьте ob_start, который позволяет вам передать обработчик обратного вызова для пост-обработки вашего скрипта.

Например, PHP включает встроенный обратный вызов http://php.net/ob_gzhandler для использования при сжатии вывода:

<?php

ob_start("ob_gzhandler");

?>
<html>
<body>
<p>This should be a compressed page.</p>
</html>
<body>

Вот более полный пример, иллюстрирующий, как вы можете привести в порядок свой HTML с расширением tidy:

function tidyhtml($input)
{
    $config = array(
           'indent'         => true,
           'output-xhtml'   => true,
           'wrap'           => 200);

    $tidy = new tidy;
    $tidy->parseString($input, $config, 'utf8');
    $tidy->cleanRepair();

    // Output
    return $tidy;
}

ob_start("tidyhtml");

//now output your ugly HTML

Если вы хотите убедиться, что все ваши PHP-скрипты используют один и тот же фильтр, не включая его напрямую, ознакомьтесь с директивой конфигурации auto_prepend_file.

Вы можете использовать буферизацию вывода и указать обратный вызов при вызове ob_start()

<?php
function filterOutput($str) {
    return strtoupper($str);
}

ob_start('filterOutput');
?>

<html>
    some stuff
    <?php echo 'hello'; ?>
</html>

Вы можете использовать функции буферизации вывода PHP, чтобы сделать это

Вы можете предоставить метод обратного вызова, который вызывается при очистке буфера, например:

<?php

function callback($buffer) {   
    // replace all the apples with oranges  
    return (str_replace("apples", "oranges", $buffer)); 
}

ob_start("callback");
?>
<html>
<body>
    <p>It's like comparing apples to oranges.</p>
</body>
</html>

<?php
ob_end_flush();
?>

В этом случае выходные данные буферизуются, а не отправляются из сценария, и непосредственно перед сбросом вызывается ваш метод обратного вызова.

Редактировать: ответ Павла лучше. Так было бы

ob_start("my_filter_function");

Мой оригинальный ответ был:

Это может быть достигнуто с помощью буферизации вывода.

Например:

ob_start();
// Generate all output
echo "all my output comes here."
// Done, filtering now
$contents = ob_get_contents();
ob_end_clean();
echo my_filter_function($contents);

Взгляните на использование Smarty. Это система шаблонов для PHP, которая является хорошей практикой, и к которой вы можете подключить глобальные выходные фильтры.

Другие вопросы по тегам