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

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

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

Спасибо.


person Gaurav Sharma    schedule 22.07.2009    source источник


Ответы (5)


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

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

<?php

ob_start("ob_gzhandler");

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

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

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.

person Paul Dixon    schedule 22.07.2009
comment
+1 за хороший ответ, я не знал аккуратного класса. Это родной класс? - person Clement Herreman; 22.07.2009
comment
Нет, это расширение. Установите через PECL, но часто упакованы для легкой установки, например. apt-get install php5-tidy на обычном компьютере с Debian/Ubuntu. - person Paul Dixon; 22.07.2009
comment
Большое спасибо, Пол. Отличный ответ. Именно то, что я искал. Предложение auto_prepend_file спасло жизнь. - person Gaurav Sharma; 23.07.2009

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

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

ob_start('filterOutput');
?>

<html>
    some stuff
    <?php echo 'hello'; ?>
</html>
person Tom Haigh    schedule 22.07.2009

Для этого вы можете использовать функции буферизации вывода в 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();
?>

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

person Mythica    schedule 22.07.2009

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

person Tim Ebenezer    schedule 22.07.2009

изменить: ответ Пола лучше. Так что это было бы

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);
person Patrice Neff    schedule 22.07.2009