How to minify php page html output?

PhpHtmlMinify

Php Problem Overview


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?

Php Solutions


Solution 1 - Php

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

?>

Solution 2 - Php

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

Solution 3 - Php

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

Solution 4 - Php

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

Solution 5 - Php

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

Solution 6 - Php

> 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 > ','<','\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/

Solution 7 - Php

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

Solution 8 - Php

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

Solution 9 - Php

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.

Solution 10 - Php

I have a GitHub gist contains PHP functions to minify HTML, CSS and JS files → https://gist.github.com/taufik-nurrohman/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(); ?>

Solution 11 - Php

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

Solution 12 - Php

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

Solution 13 - Php

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

Solution 14 - Php

The easiest possible way would be using strtr and removing the whitespace. That being said don't use javascript as it might break your code.

$html_minify = fn($html) => strtr($html, [PHP_EOL => '', "\t" => '', '  ' => '', '< ' => '<', '> ' => '>']);

echo $html_minify(<<<HTML
<li class="flex--item">
    <a href="#"
        class="-marketing-link js-gps-track js-products-menu"
        aria-controls="products-popover"
        data-controller="s-popover"
        data-action="s-popover#toggle"
        data-s-popover-placement="bottom"
        data-s-popover-toggle-class="is-selected"
        data-gps-track="top_nav.products.click({location:2, destination:1})"
        data-ga="[&quot;top navigation&quot;,&quot;products menu click&quot;,null,null,null]">
        Products
    </a>
</li>
HTML);

// Response (echo): <li class="flex--item"><a href="#"class="-marketing-link js-gps-track js-products-menu"aria-controls="products-popover"data-controller="s-popover"data-action="s-popover#toggle"data-s-popover-placement="bottom"data-s-popover-toggle-class="is-selected"data-gps-track="top_nav.products.click({location:2, destination:1})"data-ga="[&quot;top navigation&quot;,&quot;products menu click&quot;,null,null,null]">Products</a></li>

Solution 15 - Php

This work for me on php apache wordpress + w total cache + amp put it on the top of php page

<?Php
if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')){
    ob_start ('ob_html_compress'); 
}else{
    ob_start(); 
}
function ob_html_compress($buf) {
$search = array('/\>[^\S ]+/s', '/[^\S ]+\</s', '/(\s)+/s', '/<!--(.|\s)*?-->/');
$replace = array('>', '<', '\\1', '');
$buf = preg_replace($search, $replace, $buf);
return $buf;

return str_replace(array("\n","\r","\t"),'',$buf);
}
?>

then the rest of ur php or html stuff

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionm3tsysView Question on Stackoverflow
Solution 1 - PhpRakesh SankarView Answer on Stackoverflow
Solution 2 - Phpdogmatic69View Answer on Stackoverflow
Solution 3 - PhpRadek PechView Answer on Stackoverflow
Solution 4 - PhpMohamad HamoudayView Answer on Stackoverflow
Solution 5 - PhpAndrewView Answer on Stackoverflow
Solution 6 - PhpAvi TyagiView Answer on Stackoverflow
Solution 7 - PhpTeodor SanduView Answer on Stackoverflow
Solution 8 - PhpRudi VisserView Answer on Stackoverflow
Solution 9 - PhpArjanSchoutenView Answer on Stackoverflow
Solution 10 - PhpTaufik NurrohmanView Answer on Stackoverflow
Solution 11 - PhpزيادView Answer on Stackoverflow
Solution 12 - PhpbocapioView Answer on Stackoverflow
Solution 13 - PhpUjjwal SinghView Answer on Stackoverflow
Solution 14 - PhpTeslaView Answer on Stackoverflow
Solution 15 - PhpMunaView Answer on Stackoverflow