On-the-fly CSS Compression
<?php | |
/** | |
* On-the-fly CSS Compression | |
* Copyright (c) 2009 and onwards, Manas Tungare. | |
* Creative Commons Attribution, Share-Alike. | |
* | |
* In order to minimize the number and size of HTTP requests for CSS content, | |
* this script combines multiple CSS files into a single file and compresses | |
* it on-the-fly. | |
* | |
* To use this in your HTML, link to it in the usual way: | |
* <link rel="stylesheet" type="text/css" media="screen, print, projection" href="/css/compressed.css.php" /> | |
*/ | |
/* Add your CSS files to this array (THESE ARE ONLY EXAMPLES) */ | |
$cssFiles = array( | |
"ads.css", | |
"formatting.css", | |
"pagesections.css", | |
"print.css", | |
"screen.css", | |
"sidebar.css" | |
); | |
/** | |
* Ideally, you wouldn't need to change any code beyond this point. | |
*/ | |
$buffer = ""; | |
foreach ($cssFiles as $cssFile) { | |
$buffer .= file_get_contents($cssFile); | |
} | |
// Remove comments | |
$buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); | |
// Remove space after colons | |
$buffer = str_replace(': ', ':', $buffer); | |
// Remove whitespace | |
$buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); | |
// Enable GZip encoding. | |
ob_start("ob_gzhandler"); | |
// Enable caching | |
header('Cache-Control: public'); | |
// Expire in one day | |
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 86400) . ' GMT'); | |
// Set the correct MIME type, because Apache won't set it for us | |
header("Content-type: text/css"); | |
// Write everything out | |
echo($buffer); | |
?> |
This comment has been minimized.
This comment has been minimized.
Stripping out all spaces seems to break CSS descendant selectors, instead replace 2 or more spaces, with a single space. Change this: $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); To this: $buffer = str_replace(array("\r\n", "\r", "\n", "\t"), '', $buffer);
$buffer = ereg_replace(" {2,}", ' ',$buffer); |
This comment has been minimized.
This comment has been minimized.
Why you don't use trim(); ? |
This comment has been minimized.
This comment has been minimized.
$buffer = preg_replace('/[\t\r\n]+/', '', $buffer);
$buffer = preg_replace('/[\s]{2,}/', ' ', $buffer);
$buffer = str_replace(': ', ':', $buffer); |
This comment has been minimized.
This comment has been minimized.
I forked this to fix an issue it had. It would break space-separated values when the developer has used more than one space to separate the values. Pertinent code is here:
|
This comment has been minimized.
This comment has been minimized.
@manas, if compressing multiple stylesheets from different locations. And, some stylesheets contains links to fonts and images. How to handle this? |
This comment has been minimized.
This comment has been minimized.
Adding to this, you can shorten hex colors like
|
This comment has been minimized.
This comment has been minimized.
I've combined all the space removal
|
This comment has been minimized.
This comment has been minimized.
Might be in the extremes:
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Made a little OSX front end for this because I wanted a convenient way to strip css comments out of my files. https://github.com/impishj/simple-osx-css-compressor
Thanks for the script