Reguläre Ausdrücke -> CSS sortieren

nepda

Erfahrenes Mitglied
Hallo,

ich versuche jetzt schon eine ganze Weile an regulären Ausdrücken rum, ich habe auch schon einige Sachen mit diesen hingekriegt. Doch jetzt steh ich irgendwie auf dem Schlauch: Ich will eine CSS Datei sortieren, bzw. ungültige Eigenschaften und Werte entfernen etc. Ich würde gern die CSS Datei in ein Array schreiben, dass dann ungefähr so aussieht:

Code:
#selektor {
    eigenschaft-a: wert-a;
    eigenschaft-b: wert-b;
}
.selektor {
    eigenschaft-a: wert-a;
}

Array (
    [#selektor] => Array (
        'eigenschaften' => Array('eigenschaft-a', 'eigenschaft-b')
        'werte'         => Array('wert-a', 'wert-b')
    ),
    [.selektor] = Array (
        'eigenschaften' => Array('eigenschaft-a')
        'werte'         => Array('wert-a')
    )
)

Wie ich das ganze dann sortiere, lösche, etc. ist nicht das Problem, eben "nur" der reguläre Ausdruck.

P.S.: Ich arbeite mit Klassen

Danke.
 
Die Syntax von CSS ist eigentlich schon recht komplex. Hier mal ein sehr vereinfachter Perl-kompatiblen regulären Ausdruck für Regeln:
Code:
/(.+?)\s*\{(\s*[a-z-]+\s*:\s*.+?\s*(?:;\s*[a-z-]+?\s*:\s*.+?\s*)*;?)\}/s
Dabei erhältst du zwei Rückreferenzen, wobei die erste der Selektor und der zweite die Regeldeklarationen sind. Letzteres müsstest du noch einmal auseinandernehmen.
 
das war echt komisch: nachdem ich die Frage hier geschrieben hatte habe ich mich nochmal dran gesetzt und siehe da, ich hab eine Lösung gefunden. Bis jetzt löscht meine Lösung zwar noch alle Kommentare und ist noch nicht viel geprüft worden, aber ich denke das sind nur noch Klein-/Feinheiten.

Wenn es jemanden interessiert:

PHP:
<?php
error_reporting(E_ALL);
Header("Content-Type: text/css");

define("eigStart", 4);     // an dieser Stelle fangen die Eigenschaften an
define("wertStart", 30);   // an dieser Stelle fangen die Werte an

$css_version = 3;          // hat bis jetzt noch keine Wirkung, soll aber mal die
                           // Eigenschaften auf Gültigkeit überprüfen
$css_datei   = "test.css"; // die zu sortierende CSS-Datei


$css = file_get_contents($css_datei);
$css_array = array();

function css_main ($treffer)
{
    global $css_array;
    global $css_version;

    $selektor      = $treffer[1];
    $selektor      = preg_replace("/\/\*(.*)\*\//Usi", "", $selektor);
    $selektor      = str_replace("\n", "", $selektor);
    $eigenschaften = $treffer[2];

    $eigenschaften_lines = explode(";", $eigenschaften);
    unset($eigenschaften_lines[count($eigenschaften_lines) - 1]);

    foreach ($eigenschaften_lines as $eigenschaft_wert)
    {
        $eigenschaft_wert = str_replace("\n", "", $eigenschaft_wert);
        $eigenschaft_wert = trim($eigenschaft_wert);

        if (!eregi("\/\*", $eigenschaft_wert))
        {
            $eigenschaft_wert_trennung = explode(":", $eigenschaft_wert);

            // hier könnte man mit einer foreach-Schleife
            // foreach ($eigenschaft_wert_trennung as $aktuelle_eigenschaft => $aktueller_wert)
            // die einzelnen Eigenschaften und Werte überprüfen

            $eigenschaften_out[trim($eigenschaft_wert_trennung[0])] = trim($eigenschaft_wert_trennung[1]);
        }
    }
    $css_array[$selektor] = $eigenschaften_out;
}

preg_replace_callback("/(.*) ?\{(.*)\}/Usi", 'css_main', $css);


function sort_css ()
{ // ist sozusagen wie ein Template, dass man hier anpassen kann
    global $css_array;
    global $css_version;
    $output = "";

    foreach ($css_array as $selektor => $werte)
    {
        $output .= "$selektor {\n";
        foreach ($werte as $eigenschaft => $wert)
        {
            $output .= str_repeat(" ", eigStart).$eigenschaft.": ".str_repeat(" ", wertStart - eigStart - strlen($eigenschaft) - 2).$wert.";\n";
        }
        $output .= "}\n";
    }

    return $output;
}

echo sort_css();
?>

Trotzdem Danke für deine Hilfe!

EDIT:
Ich habe jetzt noch mal etwas online gestellt, falls jemand wissen will wie, einfach melden. CSS sortieren und dynamisch an Browser anpassen
 
Zuletzt bearbeitet:
Zurück