Jörg Peschke: CSS Parsen mit RexExp

Hallo,
Ich versuche mich gerade an einer Perl-Funktion, die Stylesheet-Definitionen aus einer CSS-Datei liest, und komme da nicht so recht weiter - vielleicht kann mir jemand helfen...

Naiv gehe ich jetzt erstmal davon aus, dass in einer CSS-Datei nur zwei verschiedene Befehlsblöcke vorkommen können, nämlich:

  • Klassendefinitionen: in der Form SELECTOR_TEXT {Style-Definitionen}
  • Import-Anweisungen in der Form @import IRGENDWAS;

Mein Regexp, welches mir alle solchen Befehlsblöcke in ein Array spucken soll, sieht bislang so aus:

my @style_definitions = $source =~ /([^@{]*?(@[^;]*?;|{[^}]*}))/gis;

Das klappt schon fast ganz gut.
Mein Problem ist aber, dass er durch die zweifache Klammerung Teile der Suchergebnisse doppelt hat.

Beispiel:
Aus einer CSS-Datei der Form
@import test.css;
h1 li {font-size: 12px;}

würde das folgende Befehlsblöcke finden:

@import url(test.css);
@import url(test.css);
h1 li {font-size: 12px;}
{font-size: 12px;}

Kann ich dem RegExp-Parser irgendwie sagen, dass er in das Arry nur die Suchergebnisse der äußeren Klammerung tun soll?

Danke für die Hilfe schonmal.

gruesse,
Joerg

  1. Hallo,
    Hab es

    my @style_definitions = $source =~ /([^@{]*?(@[^;]*?;|{[^}]*}))/gis;

    my @style_definitions = $source =~ /([^@{]*?@[^;]*?;)|([^@{]*?{[^}]*})/gis;

    muss das heissen.
    Danke.