Daten aus .CSS-Datei auslesen und in MySQL-DB schreiben

dwex

Erfahrenes Mitglied
Hallo Leute,

ich habe hier über 1000 CSS-Dateien mit jeweils der gleichen Syntax und verschiedenen Inhalt.
Ich muss jetzt die einzelnen Farben und Einstellungen der CSS-Datei in eine MySQL-DB übertragen.
Habe mir gedacht ich mach das automatisch statt mit der Hand :-)

Hier mal die CSS-Datei:
PHP:
body {	     background-color: #ffffff;
					    color: #000000; font-family: Verdana; font-size: 8pt;
		 scrollbar-base-color: #336695;
		scrollbar-track-color: #ff9900;
		scrollbar-arrow-color: #ff9900;}
.td {					color: #000000; font-family: Verdana; font-size: 8pt; text-decoration: none;}
.rahmen {	 background-color: #ff9900;}
.hgtabelle { background-color: #ffffff; font-family: Verdana; font-size: 8pt;}
.titel {				color: #336695; font-family: Verdana; font-size: 8pt; font-weight: bold;}
.hgtitel {	 background-color: #ff9900;}
.linie {				color: #ff9900;}
.Ort {					color: #ff9900; font-family: Verdana; font-size: 8pt;}
.input {	 background-color: #ffffff; font-family: Verdana; font-size: 8pt;}
.input_submit{							font-family: Verdana; font-size: 8pt;}
a.link:link {			color: #336695; font-family: Verdana; font-size: 8pt; text-decoration: none;}
a:link {				color: #336695; font-family: Verdana; font-size: 8pt; text-decoration: none;}
a.link:active {			color: #bf0000; font-family: Verdana; font-size: 8pt; text-decoration: none;}
a:active {				color: #bf0000; font-family: Verdana; font-size: 8pt; text-decoration: none;}
a.link:visited {		color: #336695; font-family: Verdana; font-size: 8pt; text-decoration: none;}
a:visited {				color: #336695; font-family: Verdana; font-size: 8pt; text-decoration: none;}
a:hover {				color: #ff9911; font-family: Verdana; font-size: 8pt; text-decoration: underline;}
a.link:hover {			color: #ff9911; font-family: Verdana; font-size: 8pt; text-decoration: underline;}
Habt Ihr eine Idee wie ich die Daten in meine MySQL-Tabelle bringe - mir fehlt momentan leider jeglicher Lösungsansatz.

Vielen Dank für eure Hilfe im Voraus.
 
Da ich mir nicht sicher war, ob es klappt, habe ich es gleich mal getestet.
Zunächst solltest Du die Daten aus dem "Textformat" herausreißen und in eine Struktur bringen. Ich habe mir überlegt, dass es in PHP am einfachsten ist, die Daten in einem Array zu strukturieren.Es geht im Wesentlichen darum, das CSS-File Schritt für Schritt in seine Bestandteile zu zerlegen. Zunächst wird anhand der schließenden geschweiften Klammer in die verschiedenen Selektoren aufgeteilt, dann anhand der öffnenden geschweiften Klammer zwischen Selektor und Eigenschaften getrennt. Dann werden die Eigenschaft anhand des Semikolon voneinander getrennt und letzlich der Eigenschaftsname vom Eigenschaftswert anhand des Doppelpunkt.
Wenn Semikolon, oder eine der geschweiften Klammern im CSS auch noch woanders vorkommen können, als ich jetzt angenommen habe, wird das Skript nicht mehr funktionieren.
Nun aber das Skript:
PHP:
<pre>
<?
$cssData=" body {         ba...
    DER GESAMTE CSS-CODE,
    DEN DU OBEN GEPOSTEST HAST
    underline;}";

$split=preg_split("/\}/",trim($cssData));

$all=array();
foreach($split as $s) {
    if (!empty($s)) {
        $tmp=preg_split("/\{/",trim($s));
        $sel=trim($tmp[0]);
        $css=preg_split("/;/",trim($tmp[1]));
        $tmp=array();
        $tmp['selektor']=$sel;
        $tmp['properties']=array();
        foreach($css as $c) {
            if (!empty($c)) {
                $p=preg_split("/\:/",trim($c));
                $tmp['properties'][]=array(
                    "name" => trim($p[0]),
                    "value" => trim($p[1]));
            }
        }
        $all[]=$tmp;
    }
}
//Ausgabe
print_r($all);
?>
</pre>
Das Array $all enthält nun alle Selektoren. Darin befindet sich für jeden Selektor ein assoziatives Array mit den Indizes selektor und properties. Im Index selektor befindet sich ein String, der den Selektor enthält. Im Index properties befindet sich mal wieder ein Array, welches alle Eigenschaften enthält. Die Eigenschaften liegen da wiederum als assoziatives Array mit den Indizes name und value. Wie das aussieht, erkennst Du in der Ausgabe (vorher Dein CSS wieder einfügen).

Dieses Array kannst Du mit zwei verschachtelten foreach-Schleifen durchlaufen und in die Datenbank eintragen.

Als Tabellenstruktur könnte ich mir folgende vorstellen:
Tabelle: CSS
Felder: CSSFile, Selektor, PropertyName, PropertyValue

Vielleicht konnte ich Dir damit ja ein bisschen weiterhelfen.

Gruß hpvw
 
Hallo hpvw,

vielen Dank dein Script funktioniert super - leider habe ich gerade festgestellt, dass ich offensichtlich Nachhilfe in Sachen "Array" benötige.

Ich wollte jetzt mal den ersten Wert ausgeben und habe folgendes eingegeben:
echo $all[0][0]['value'];

Leider kommt da nichts raus - ich bin jetzt leicht (bis mittelschwer) verwirrt.
 
dwex hat gesagt.:
Hallo hpvw,

vielen Dank dein Script funktioniert super - leider habe ich gerade festgestellt, dass ich offensichtlich Nachhilfe in Sachen "Array" benötige.

Ich wollte jetzt mal den ersten Wert ausgeben und habe folgendes eingegeben:
echo $all[0][0]['value'];

Leider kommt da nichts raus - ich bin jetzt leicht (bis mittelschwer) verwirrt.
Den Array-Index gibt es ja auch nicht, sondern $all[0]['properties'][0]['value'], welcher im Beispiel die Hintergrundfarbe für den body enthält.

Gruß hpvw
 
Hallo hpvw,

vielen Dank - du kennst mich ja - hatte wieder mal Tomaten auf den Augen - oder auch im Gehirn :-( ;)

Jetzt wird mir so einiges klar.
 
Ich habe dem Ganzen jetzt noch folgende drei Zeilen vorangestellt:
PHP:
$cssData=preg_replace("/(\/\*.*?\*\/)/", "", $cssData);
$cssData=preg_replace("/(\r)/", "", $cssData);
$cssData=preg_replace("/(\n)/", "", $cssData);
Damit werden Kommentare und Zeilenumbrüche vorweg herausgefiltert.

Gruß hpvw
 
Zurück