Du bist hier: StartPHPFunktionen › CSS komprimierenDieses Snippet kommentieren

CSS-Dateien komprimieren

Diese Funktion komprimiert eine CSS-Datei. Alle unnötigen Zeichen werden entfernt.

function compressFile($filename, $oneDefinitionPerLine = false) {
    $content = file_get_contents($filename);
    // Kommentare entfernen
    $content = preg_replace('#/\*.*?\*/#si', '', $content);
    // Mehrfache Leerzeichen entfernen
    $content = preg_replace('# +#i', ' ', $content);
    // Zeilenumbrüche/Tabs entfernen
    $content = str_replace(array("\t","\n","\r"), '', $content);
    // Leerzeichen vor/nach Doppelpunkten entfernen
    $content = preg_replace('#\s*:\s*#si', ':', $content);
    // Leerzeichen vor/nach { und , entfernen
    $content = preg_replace('#\s*(\{|,|\})\s*#si', '\1', $content);
    // Leerzeichen nach Zeilenumbrüchen entfernen
    $content = str_replace("\n ", "\n", $content);
    // Das letzte Semikolon einer Definition ist unnütz
    $content = str_replace(';}', '}', $content);
    // Einheiten, die ,0 notiert wurden, kürzen ("1.0" -> "1")
    $content = preg_replace('~([0-9]+)\.0(em|ex|cm|mm|in|pt|pc)~i', '\1\2', $content);
    // Angaben wie 0px auf 0 reduzieren
    $content = preg_replace('~0(em|ex|cm|mm|in|pt|pc)~i', '0', $content);
    // Doppelte Semikolons entfernen
    $content = preg_replace('~;+~i', ';', $content);
    
    // Regeln der Form EIGENSCHAFT:A A A A; zu EIGENSCHAFT:A; und
    // EIGENSHAFT:A B A B; zu EIGENSCHAFT:A B; umformen.
    $matches = false;
    
    preg_match_all('#(margin|padding|border-width):([0-9a-z]+)\s+([0-9a-z]+)\s+([0-9a-z]+)\s+([0-9a-z]+)\s*;#si', $content, $matches);
    
    if ( $matches ) {
        foreach ( $matches[0] as $idx => $matchText ) {
            $first  = $matches[2][$idx];
            $second = $matches[3][$idx];
            $third  = $matches[4][$idx];
            $fourth = $matches[5][$idx];
            
            if ( $first == $second && $second == $third && $third == $fourth ) {
                $content = str_replace($matchText, $matches[1][$idx].':'.$first.';', $content);
                continue;
            }
            
            if ( $first == $third && $second == $fourth ) {
                $content = str_replace($matchText, $matches[1][$idx].':'.$first.' '.$second.';', $content);
            }
        }
    }
    
    // Farben der Form #AABBCC zu #ABC umformen
    preg_match_all('~#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})~si', $content, $matches);
    
    if ( $matches ) {
        foreach ( $matches[0] as $idx => $matchText ) {
            $first  = $matches[1][$idx];
            $second = $matches[2][$idx];
            $third  = $matches[3][$idx];
            
            if ( $first[0] == $first[1] && $second[0] == $second[1] && $third[0] == $third[1] ) {
                $content = str_replace($matchText, '#'.$first[0].$second[0].$third[0], $content);
            }
        }
    }
    
    // Auf Wunsch jede Gruppe in eine einzelne Zeile schreiben (Debugging)
    if ( $oneDefinitionPerLine ) {
        $content = str_replace('}', "}\n", $content);
    }
    
    return $content;
}

Kommentar verfassen

Fehler gefunden? Doofer Code? Ein kleines "Danke!"? Hinterlasse einfach einen Kommentar.

(muss sein)
(muss nicht sein, wird nicht angezeigt)

Dein Kommentar wird erst nach einer manuellen Prüfung angezeigt.