Заставить весь вывод 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, которая является хорошей практикой, и к которой вы можете подключить глобальные выходные фильтры.