How to minify php page html output?

2019-01-01 06:42发布

问题:

I am looking for a php script or class that can minify my php page html output like google page speed does.

How can I do this?

回答1:

CSS and Javascript

Consider the following link to minify Javascript/CSS files: https://github.com/mrclay/minify

HTML

Tell Apache to deliver HTML with GZip - this generally reduces the response size by about 70%. (If you use Apache, the module configuring gzip depends on your version: Apache 1.3 uses mod_gzip while Apache 2.x uses mod_deflate.)

Accept-Encoding: gzip, deflate

Content-Encoding: gzip

Use the following snippet to remove white-spaces from the HTML with the help ob_start\'s buffer:

<?php

function sanitize_output($buffer) {

    $search = array(
        \'/\\>[^\\S ]+/s\',     // strip whitespaces after tags, except space
        \'/[^\\S ]+\\</s\',     // strip whitespaces before tags, except space
        \'/(\\s)+/s\',         // shorten multiple whitespace sequences
        \'/<!--(.|\\s)*?-->/\' // Remove HTML comments
    );

    $replace = array(
        \'>\',
        \'<\',
        \'\\\\1\',
        \'\'
    );

    $buffer = preg_replace($search, $replace, $buffer);

    return $buffer;
}

ob_start(\"sanitize_output\");

?>


回答2:

Turn on gzip if you want to do it properly. You can also just do something like this:

$this->output = preg_replace(
    array(
        \'/ {2,}/\',
        \'/<!--.*?-->|\\t|(?:\\r?\\n[ \\t]*)+/s\'
    ),
    array(
        \' \',
        \'\'
    ),
    $this->output
);

This removes about 30% of the page size by turning your html into one line, no tabs, no new lines, no comments. Mileage may vary



回答3:

All of the preg_replace() solutions above have issues of single line comments, conditional comments and other pitfalls. I\'d recommend taking advantage of the well-tested Minify project rather than creating your own regex from scratch.

In my case I place the following code at the top of a PHP page to minify it:

function sanitize_output($buffer) {
    require_once(\'min/lib/Minify/HTML.php\');
    require_once(\'min/lib/Minify/CSS.php\');
    require_once(\'min/lib/JSMin.php\');
    $buffer = Minify_HTML::minify($buffer, array(
        \'cssMinifier\' => array(\'Minify_CSS\', \'minify\'),
        \'jsMinifier\' => array(\'JSMin\', \'minify\')
    ));
    return $buffer;
}
ob_start(\'sanitize_output\');


回答4:

I\'ve tried several minifiers and they either remove too little or too much.

This code removes redundant empty spaces and optional HTML (ending) tags. Also it plays it safe and does not remove anything that could potentially break HTML, JS or CSS.

Also the code shows how to do that in Zend Framework:

class Application_Plugin_Minify extends Zend_Controller_Plugin_Abstract {

  public function dispatchLoopShutdown() {
    $response = $this->getResponse();
    $body = $response->getBody(); //actually returns both HEAD and BODY

    //remove redundant (white-space) characters
    $replace = array(
        //remove tabs before and after HTML tags
        \'/\\>[^\\S ]+/s\'   => \'>\',
        \'/[^\\S ]+\\</s\'   => \'<\',
        //shorten multiple whitespace sequences; keep new-line characters because they matter in JS!!!
        \'/([\\t ])+/s\'  => \' \',
        //remove leading and trailing spaces
        \'/^([\\t ])+/m\' => \'\',
        \'/([\\t ])+$/m\' => \'\',
        // remove JS line comments (simple only); do NOT remove lines containing URL (e.g. \'src=\"http://server.com/\"\')!!!
        \'~//[a-zA-Z0-9 ]+$~m\' => \'\',
        //remove empty lines (sequence of line-end and white-space characters)
        \'/[\\r\\n]+([\\t ]?[\\r\\n]+)+/s\'  => \"\\n\",
        //remove empty lines (between HTML tags); cannot remove just any line-end characters because in inline JS they can matter!
        \'/\\>[\\r\\n\\t ]+\\</s\'    => \'><\',
        //remove \"empty\" lines containing only JS\'s block end character; join with next line (e.g. \"}\\n}\\n</script>\" --> \"}}</script>\"
        \'/}[\\r\\n\\t ]+/s\'  => \'}\',
        \'/}[\\r\\n\\t ]+,[\\r\\n\\t ]+/s\'  => \'},\',
        //remove new-line after JS\'s function or condition start; join with next line
        \'/\\)[\\r\\n\\t ]?{[\\r\\n\\t ]+/s\'  => \'){\',
        \'/,[\\r\\n\\t ]?{[\\r\\n\\t ]+/s\'  => \',{\',
        //remove new-line after JS\'s line end (only most obvious and safe cases)
        \'/\\),[\\r\\n\\t ]+/s\'  => \'),\',
        //remove quotes from HTML attributes that does not contain spaces; keep quotes around URLs!
        \'~([\\r\\n\\t ])?([a-zA-Z0-9]+)=\"([a-zA-Z0-9_/\\\\-]+)\"([\\r\\n\\t ])?~s\' => \'$1$2=$3$4\', //$1 and $4 insert first white-space character found before/after attribute
    );
    $body = preg_replace(array_keys($replace), array_values($replace), $body);

    //remove optional ending tags (see http://www.w3.org/TR/html5/syntax.html#syntax-tag-omission )
    $remove = array(
        \'</option>\', \'</li>\', \'</dt>\', \'</dd>\', \'</tr>\', \'</th>\', \'</td>\'
    );
    $body = str_ireplace($remove, \'\', $body);

    $response->setBody($body);
  }
}

But note that when using gZip compression your code gets compressed a lot more that any minification can do so combining minification and gZip is pointless, because time saved by downloading is lost by minification and also saves minimum.

Here are my results (download via 3G network):

 Original HTML:        150kB       180ms download
 gZipped HTML:          24kB        40ms
 minified HTML:        120kB       150ms download + 150ms minification
 min+gzip HTML:         22kB        30ms download + 150ms minification


回答5:

you can check out this set of classes: https://code.google.com/p/minify/source/browse/?name=master#git%2Fmin%2Flib%2FMinify , you\'ll find html/css/js minification classes there.

you can also try this: http://code.google.com/p/htmlcompressor/

Good luck :)



回答6:

Create a PHP file outside your document root. If your document root is

/var/www/html/

create the a file named minify.php one level above it

/var/www/minify.php

Copy paste the following PHP code into it

<?php
function minify_output($buffer){
    $search = array(\'/\\>[^\\S ]+/s\',\'/[^\\S ]+\\</s\',\'/(\\s)+/s\');
    $replace = array(\'>\',\'<\',\'\\\\1\');
    if (preg_match(\"/\\<html/i\",$buffer) == 1 && preg_match(\"/\\<\\/html\\>/i\",$buffer) == 1) {
        $buffer = preg_replace($search, $replace, $buffer);
    }
    return $buffer;
}
ob_start(\"minify_output\");?>

Save the minify.php file and open the php.ini file. If it is a dedicated server/VPS search for the following option, on shared hosting with custom php.ini add it.

auto_prepend_file = /var/www/minify.php

Reference: http://websistent.com/how-to-use-php-to-minify-html-output/



回答7:

This work for me.

function Minify_Html($Html)
{
   $Search = array(
    \'/(\\n|^)(\\x20+|\\t)/\',
    \'/(\\n|^)\\/\\/(.*?)(\\n|$)/\',
    \'/\\n/\',
    \'/\\<\\!--.*?-->/\',
    \'/(\\x20+|\\t)/\', # Delete multispace (Without \\n)
    \'/\\>\\s+\\</\', # strip whitespaces between tags
    \'/(\\\"|\\\')\\s+\\>/\', # strip whitespaces between quotation (\"\') and end tags
    \'/=\\s+(\\\"|\\\')/\'); # strip whitespaces between = \"\'

   $Replace = array(
    \"\\n\",
    \"\\n\",
    \" \",
    \"\",
    \" \",
    \"><\",
    \"$1>\",
    \"=$1\");

$Html = preg_replace($Search,$Replace,$Html);
return $Html;
}


回答8:

You can look into HTML TIDY - http://uk.php.net/tidy

It can be installed as a PHP module and will (correctly, safely) strip whitespace and all other nastiness, whilst still outputting perfectly valid HTML / XHTML markup. It will also clean your code, which can be a great thing or a terrible thing, depending on how good you are at writing valid code in the first place ;-)

Additionally, you can gzip the output using the following code at the start of your file:

ob_start(\'ob_gzhandler\');


回答9:

First of all gzip can help you more than a Html Minifier

  1. With nginx:

    gzip on;
    gzip_disable \"msie6\";
    
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
  2. With apache you can use mod_gzip

Second: with gzip + Html Minification you can reduce the file size drastically!!!

I\'ve created this HtmlMinifier for PHP.

You can retrieve it through composer: composer require arjanschouten/htmlminifier dev-master.

There is a Laravel service provider. If you\'re not using Laravel you can use it from PHP.

// create a minify context which will be used through the minification process
$context = new MinifyContext(new PlaceholderContainer());
// save the html contents in the context
$context->setContents(\'<html>My html...</html>\');
$minify = new Minify();
// start the process and give the context with it as parameter
$context = $minify->run($context);

// $context now contains the minified version
$minifiedContents = $context->getContents();

As you can see you can extend a lot of things in here and you can pass various options. Check the readme to see all the available options.

This HtmlMinifier is complete and safe. It takes 3 steps for the minification process:

  1. Replace critical content temporary with a placeholder.
  2. Run the minification strategies.
  3. Restore the original content.

I would suggest that you cache the output of you\'re views. The minification process should be a one time process. Or do it for example interval based.

Clear benchmarks are not created at the time. However the minifier can reduce the page size with 5-25% based on the your markup!

If you want to add you\'re own strategies you can use the addPlaceholder and the addMinifier methods.



回答10:

I have a GitHub gist contains PHP functions to minify HTML, CSS and JS files → https://gist.github.com/tovic/d7b310dea3b33e4732c0

Here’s how to minify the HTML output on the fly with output buffer:

<?php

include \'path/to/php-html-css-js-minifier.php\';

ob_start(\'minify_html\');

?>

<!-- HTML code goes here ... -->

<?php echo ob_get_clean(); ?>


回答11:

If you want to remove all new lines in the page, use this fast code:

ob_start(function($b){
if(strpos($b, \"<html\")!==false) {
return str_replace(PHP_EOL,\"\",$b);
} else {return $b;}
});


回答12:

Thanks to Andrew. Here\'s what a did to use this in cakePHP:

  1. Download minify-2.1.7
  2. Unpack the file and copy min subfolder to cake\'s Vendor folder
  3. Creates MinifyCodeHelper.php in cake\'s View/Helper like this:

    App::import(\'Vendor/min/lib/Minify/\', \'HTML\');
    App::import(\'Vendor/min/lib/Minify/\', \'CommentPreserver\');
    App::import(\'Vendor/min/lib/Minify/CSS/\', \'Compressor\');
    App::import(\'Vendor/min/lib/Minify/\', \'CSS\');
    App::import(\'Vendor/min/lib/\', \'JSMin\');
    class MinifyCodeHelper extends Helper {
        public function afterRenderFile($file, $data) {
            if( Configure::read(\'debug\') < 1 ) //works only e production mode
                $data = Minify_HTML::minify($data, array(
                    \'cssMinifier\' => array(\'Minify_CSS\', \'minify\'),
                    \'jsMinifier\' => array(\'JSMin\', \'minify\')
                ));
            return $data;
        }
    }
    
  4. Enabled my Helper in AppController

    public $helpers = array (\'Html\',\'...\',\'MinifyCode\');

5... Voila!

My conclusion: If apache\'s deflate and headers modules is disabled in your server your gain is 21% less size and 0.35s plus in request to compress (this numbers was in my case).

But if you had enable apache\'s modules the compressed response has no significant difference (1.3% to me) and the time to compress is the samne (0.3s to me).

So... why did I do that? \'couse my project\'s doc is all in comments (php, css and js) and my final user dont need to see this ;)



回答13:

You can use a well tested Java minifier like HTMLCompressor by invoking it using passthru (exec).
Remember to redirect console using 2>&1

This however may not be useful, if speed is a concern. I use it for static php output



标签: php html minify