21
SEP

Créez un minifier / réducteur de code CSS en PHP

Publié le 21/09/09 à 07h06 par DJo

lateralcode.com nous explique comment réaliser un Minifier de code CSS en PHP. Très pratique si vous souhaitez alléger le poids de vos styles CSS et améliorer les performances de chargement de votre site.

Créer un script de minification CSS en PHP

L'objectif étant de créer un script de réduction automatique du CSS, sans avoir à le compiler à chaque modification à l'aide d'un service web ou d'une librairie quelconque.

 

Commençons par créer la fonction de Minification du code CSS:

function minify( $css ) {
    $css = preg_replace( '#/*.*?*/#s', '', $css );
    $css = preg_replace( '#s+#', ' ', $css );
    $css = str_replace( '; ', ';', $css );
    $css = str_replace( ': ', ':', $css );
    $css = str_replace( ' {', '{', $css );
    $css = str_replace( '{ ', '{', $css );
    $css = str_replace( ', ', ',', $css );
    $css = str_replace( '} ', '}', $css );
    $css = str_replace( ';}', '}', $css );

    return trim( $css );
}

Une fonction très simple qui permet de faire tout le travail de réduction d'espaces.

 

Maintenant que l'on a notre fonction, nous voulons pouvoir l'utiliser dynamiquement au chargement de notre fichier CSS:

<link rel="stylesheet" type="text/css" file="minify.php?css=styles.css" />

 

Ce qui nous donne finalement la page minify.php suivante:

<?php
header( "Content-type: text/css" );

$file = isset( $_GET[ 'css' ] ) ? $_GET[ 'css' ] : '';
if( !file || array_pop( split( '.', $file ) ) != 'css' || strpos( $file, '/' ) !== false )
    die( 'Invalid Parameters' );

$content = @file_get_contents( $file );
echo minify( $content );

function minify( $css ) {
    $css = preg_replace( '#/*.*?*/#s', '', $css );
    $css = preg_replace( '#s+#', ' ', $css );
    $css = str_replace( '; ', ';', $css );
    $css = str_replace( ': ', ':', $css );
    $css = str_replace( ' {', '{', $css );
    $css = str_replace( '{ ', '{', $css );
    $css = str_replace( ', ', ',', $css );
    $css = str_replace( '} ', '}', $css );
    $css = str_replace( ';}', '}', $css );

    return trim( $css );
}
?>

Un code qui peut vous être utile! Reste à rajouter un système de cache et le script sera parfait.

 

Retrouvez toute la démarche sur le Site Officiel

Baraguiné par barberousse le 21/09/09 à 08h16
barberousse sur La Ferme du Web
Dans le même genre que la fonction "minify()", je recommande pour ma part le packer de Dean Edwards ( http://joliclic.free.fr/php/javascript-packer/en/ ), qui permet de compresser aussi le javascript (très efficacement).
On crée un fichier php du même genre que celui que nous indique Djo, avec des headers de type "text/javascript".

Les utilisateurs un peu plus avancés pourront même faire en sorte que le script gère des listes de fichiers (pour grouper tous les javascripts ou feuilles de styles), et ainsi limiter le nombre de requêtes au serveur. Ca boost un bon coup !
;)
Baraguiné par le 21/09/09 à 09h08
Très interressant. Mais question performance? Au tu des statistiques? Je vois pas trop le but de ce minifier!!
Bon tutoriel comme toujours.
Baraguiné par DJo le 21/09/09 à 09h19
DJo sur La Ferme du Web
Le but du minifier est de réduire le poids des fichiers CSS / Javascript afin d'optimiser les temps de chargements.
Je ferais un petit billet de bench un jour pour comparer les perfs :)

@barberousse: Effectivement, ça peut le faire ;)
Baraguiné par leknoppix le 05/10/09 à 15h08
leknoppix sur La Ferme du Web
Je viens de tester sur un de mes projets et le code du minifier ne marche pas du tout. Le problème vient de ces deux lignes.

$css = preg_replace( '#/*.*?*/#s', '', $css );
13. $css = preg_replace( '#s #', ' ', $css );
Baraguiné par DJo le 05/10/09 à 16h45
DJo sur La Ferme du Web
Et tu n'as pas plus d'infos sur l'erreur générée ??
Baraguiné par leknoppix le 05/10/09 à 20h54
leknoppix sur La Ferme du Web
a priorie preg_replace est erroné
Baraguiné par le 29/12/09 à 11h17
preg_replace n'est pas erroné, c'est l'expression régulière qui est mal faite.
Le caractère "*" est un caractère "réserver" (qui a un sens).
il faut donc replacer
$css = preg_replace( '#/*.*?*/#s', '', $css );
$css = preg_replace( '#s #', ' ', $css );
par
$css = preg_replace( '#/*.*?*/#s', '', $css );
$css = preg_replace( '#s #', ' ', $css );

le problème venant de la première expression.
Baraguiné par le 10/01/10 à 01h06
@Guillaume Camus: ta solution ne fonctionne pas! Tu as marqué deux fois la même chose.
Baraguiné par Matthieu le 01/02/10 à 02h06
Matthieu sur La Ferme du Web
Perso j'utilise ceci :

function minify($css){

$css = str_replace("n", '', $css);

$css = str_replace("t", '', $css);

$css = preg_replace('/((/*)(.*)(*/))/', '', $css);

$css = preg_replace('/([[:space:]]*({){1}[[:space:]]*)/', '{', $css);

$css = preg_replace('/([[:space:]]*(}){1}[[:space:]]*)/', '}', $css);

$css = preg_replace('/([[:space:]]*(:){1}[[:space:]]*)/', ':', $css);

$css = preg_replace('/([[:space:]]*(;){1}[[:space:]]*)/', ';', $css);

$css = preg_replace('/([[:space:]]*(,){1}[[:space:]]*)/', ',', $css);

$css = str_replace('0px', '0', $css);

$css = str_replace('0%' , '0', $css);

$css = str_replace('0em', '0', $css);

return trim($css);
}
Baraguiné par Matthieu le 01/02/10 à 02h10
Matthieu sur La Ferme du Web
Je voudrais juste ajouter que sans système de cache interne minimifier le code css utilise des ressources à chaque requête...

L'idée de faire cela un seule fois, de stocké le tout dans un fichier et d'inclure celui-ci. On recommence l'opération quand le contenu du fichier change... mais ça c'est votre popote interne...

@

Ajouter un Commentaire

Pour poster un commentaire, vous devez être identifié. Vous pouvez choisir parmi ces trois méthodes d'identification:

Compte la Ferme du Web

Identifiez-vous
Inscrivez-vous

Compte Facebook

Compte Twitter

Connexion avec votre compte twitter
Rechercher sur la Ferme du web