Scripts
CSS Minifier
Een simpele css minifier, gebaseerd op enkele regexes. Wordt op verschillende sites live gebruikt. Overigens is het absoluut af te raden om dit bij iedere CSS-hit te doen, gewoon van tevoren over je CSS halen (nadat je het hebt gebackupt!
cssmin.php
[code]<?php
/**
* Een helperfunctie voor PHP < 5.3.0
*/
function minifyHelper($match) {
/**
* Alles moet lowercase, maakt verder niet uit maar is
* handig bij vergelijkingen :-)
*/
$entries = array_map(
'strtolower',
explode(' ', $match[0])
);
switch(count($entries)) {
case 4:
/** 5px 5px 5px 5px => 5px 5px 5px */
if ($entries[3] === $entries[1]) {
// er zijn nog 3 over, doorvallen naar die case
array_pop($entries);
} else {
break;
}
// DOORVALLEN
case 3:
/** 5px 5px 5px => 5px 5px */
if ($entries[2] === $entries[0]) {
// nu dus nog 2 over...
array_pop($entries);
} else {
break;
}
// DOORVALLEN
case 2:
/** 5px 5px => 5px */
if ($entries[1] === $entries[0]) {
array_pop($entries);
}
}
return implode(' ', $entries);
}
/**
* CSS optimaliseren voor laag bandbreedtegebruik
*
* @param string $input
* @return string
* @author Richard van Velzen <[email protected]>
*/
function minifyCSS($input, $newlineAfterBrace = false) {
$result = trim(preg_replace_callback(
'~(?xi)
(?<!\b(?: # uitzonderingen... bah
background-position
))
:\K
(?:(?:\d*\.)?\d+ (?: [a-z]{2} | %)? | auto )
(?: \s (?:\d*\.)?\d+ (?: [a-z]{2} | %)? | auto ) {0,3}
(?= [;}] )
~S',
'minifyHelper',
preg_replace(
array(
'~(?x)
\s*
(?:
# debug-CSS weghalen
\Q/* REMOVE */\E
(?:
[\r\n]+
(?! \Q/* END REMOVE */\E )
.*
)+
[\r\n]+ \Q/* END REMOVE */\E
|
# commentaar, natuurlijk
/\* [^*]* \*+ (?: [^/] [^*]* \*+ )* /
)
\s*
~',
'~(?x)
# nietrelevante whitespace
\s+ (?! [^\'"()\r\n]* \))
~',
'@(?x)
(?<=[{};:,+>~]) \s+
| \s+ (?=[{}:,+>~;])
| ( \( [^)]* \) | " [^"]* " | \' [^\']* \' )
# een ; kan natuurlijk in een string voorkomen..
| ; (?: \s*; )* (?= \s* } )
@',
'~#(?ix)
# hex-kleuren, normaliseren naar kort formaat
([a-f\d])\1
([a-f\d])\2
([a-f\d])\3
~',
'~(?x)
# 0/0.0(px|em|etc.)? normaliseren naar 0
(?<=[:, ]) (?:0*\.)?0
(?i: [a-z]{2} | % )?
(?! \w )
~',
'@(?xm)
(?<= ^ | } )
(?:
# een selector met lege regels
(?: ^ | \s* (?: , \s*)? )
[>+~ ]?
(?: [.#]? [a-z_-]+ | \*
| \[[^]"\']*
(?:
(?: "[^"]*" | \'[^\']*\' )
[^]"\']*
)*
]
)++
)++
\s*{}\s*
@'
),
array(
// commentaar
' ',
// whitespace
' ',
// whitespace weghalen
'$1',
// hex-verkleining
'#$1$2$3',
// 0-normalisatie
'0',
// lege declaratie
''
),
trim($input)
)
));
if ($newlineAfterBrace) {
$result = trim(str_replace('}', "}\n", $result));
}
return $result;
}[/code]
Reacties
0