Dernière mise à jour: sam 14 aoû 2010

minify_js()

(PHP 5)

Supprime les caractères inutiles d'une chaîne Javascript.

Source

function minify_js($input)
{
	$output = '';
	
	$inQuotes        = array();
	$noSpacesAround  = '{}()[]<>|&!?:;,+-*/="\'';
	
	$input = preg_replace("`(\r\n|\r)`", "\n", $input);
	$inputs = str_split($input);
	$inputs_count = count($inputs);
	$prevChr = null;
	for ($i = 0; $i < $inputs_count; $i++) {
		$chr = $inputs[$i];
		$nextChr = $i+1 < $inputs_count ? $inputs[$i+1] : null;
		
		switch($chr) {
			case '/':
				if (!count($inQuotes) && $nextChr == '*' && $inputs[$i+2] != '@') {
					$i = 1 + strpos($input, '*/', $i);
					continue 2;
				} elseif (!count($inQuotes) && $nextChr == '/') {
					$i = strpos($input, "\n", $i);
					continue 2;
				} elseif (!count($inQuotes)) {
					// C'est peut-être le début d'une RegExp
					
					$eolPos = strpos($input, "\n", $i);
					if($eolPos===false) $eolPos = $inputs_count;
					$eol = substr($input, $i, $eolPos-$i);
					if (!preg_match('`^(/.+(?<=\\\/)/(?!/)[gim]*)[^gim]`U', $eol, $m)) {
						preg_match('`^(/.+(?<!/)/(?!/)[gim]*)[^gim]`U', $eol, $m);
					}
					if (isset($m[1])) {
						// C'est bien une RegExp, on la retourne telle quelle
						$output .= $m[1];
						$i += strlen($m[1])-1;
						continue 2;
					}
				}
				break;
			
			case "'":
			case '"':
				if ($prevChr != '\\' || ($prevChr == '\\' && $inputs[$i-2] == '\\')) {
					if (end($inQuotes) == $chr) {
						array_pop($inQuotes);
					} elseif (!count($inQuotes)) {
						$inQuotes[] = $chr;
					}
				}
				break;
			
			case ' ':
			case "\t":
			case "\n":
				if (!count($inQuotes)) {
					if (   strstr("{$noSpacesAround} \t\n", $nextChr)
					    || strstr("{$noSpacesAround} \t\n", $prevChr)
					) {
						continue 2;
					}
					$chr = ' ';
				}
				break;
			
			default:
				break;
		}
		
		$output .= $chr;
		$prevChr = $chr;
	}
	$output = trim($output);
	$output = str_replace(';}', '}', $output);
	
	return $output;
}

?>

Syntaxe

string minify_js ( string $input )

Arguments

  1. input - La chaîne d'entrée.

Valeurs de retour

Retourne la chaîne input dépourvue de caractère inutile.

Voir aussi

  • minify_css() - Supprime les caractères inutiles d'une chaîne CSS.

Commentaire(s)

  • Nouvelle mise à jour :
    - Correction d'un bug avec certaines RegExp
    - Meilleure "compression"

Poster un commentaire