5

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.

5 Answers 5

15

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.

Sign up to request clarification or add additional context in comments.

3 Comments

+1 for good answer, i didn't know the tidy class. Is it a native class ?
No, it's an extension. Install via PECL, but often packaged for easy install though, e.g. apt-get install php5-tidy on a typical Debian/Ubuntu box.
Thanks a lot Paul. Excellent answer. Exactly what I was looking for. The auto_prepend_file suggestion was a life-saver.
4

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>

Comments

2

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.

Comments

0

Have a look at using Smarty. It's a templating system for PHP, that is good practice to use, and into which you can plug global output filters.

Comments

0

edit: Paul's reply is better. So it would be

ob_start("my_filter_function");

My original reply was:

That can be achieved with output buffering.

For example:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.