Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making all PHP file output pass through a "filter file" before being displayed

Tags:

php

filter

Is there any way for all my PHP and/or HTML file output to be "filtered" before being displayed in the browser? I figured that I could pass it through a global function before it is displayed but I'm stuck on the implementation. Please help.

If there is a better way to achieve the same result, I'd be happy to know.

Thanks.

like image 336
Gaurav Sharma Avatar asked Jul 22 '09 10:07

Gaurav Sharma


3 Answers

Check out ob_start which lets you pass a callback handler for post-processing your script output.

For example, PHP includes a built-in callback ob_gzhandler for use in compressing the output:

<?php

ob_start("ob_gzhandler");

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

Here's a fuller example illustrating how you might tidy your HTML with the tidy extension:

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

If you wanted to ensure all your PHP scripts used the same filter without including it directly, check out the auto_prepend_file configuration directive.

like image 65
Paul Dixon Avatar answered Nov 14 '22 23:11

Paul Dixon


You can use output buffering and specify a callback when you call ob_start()

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

ob_start('filterOutput');
?>

<html>
    some stuff
    <?php echo 'hello'; ?>
</html>
like image 26
Tom Haigh Avatar answered Nov 15 '22 01:11

Tom Haigh


You can use PHP's output buffering functions to do that

You can provide a callback method that is called when the buffer is flushed, like:

<?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();
?>

In that case output is buffered instead of sent from the script and just before the flush your callback method is called.

like image 20
Mythica Avatar answered Nov 15 '22 00:11

Mythica