2016-02-26 11 views
8

Ich versuche ungültig CSS wie folgt zu transformieren:Regex hinzufügen Selektoren fehlt CSS auf ungültig

{color:red}

und es gültig machen wie diese:

.missing_selector{color:red}

Beispiel CSS:

a { 
color:black; 
background-color:blue; 
} 

{color:red} 
<!-- TEST --> 

@media screen and (max-width:620px) { 
/* TEST 2 */ 
a.test {color:blue;} 
p[class="test2"] {color:green;} 
} 

Meine aktuelle regulärer Ausdruck:

/([^a-z0-9\)\];\-_]*\{)/i

Live-Test:

http://www.phpliveregex.com/p/eMq

+0

Nur ein Hinweis, keine Antwort, aber vielleicht hilft diese Bibliothek: https://github.com/sabberworm/PHP-CSS-Parser Eine Lösung mit Regex alleine ist eher fehleranfällig, nehme ich an. – Jan

+0

Sie können versuchen, ['/^\h*\K(?={)/m'](https://regex101.com/r/mC7pI5/1) und ersetzen durch' .missing_selector' –

Antwort

6

Die Lösung

Sie müssen diese verwenden:

/(?<=\A|\})(\s*)\{/m 

Ersetzen durch:

.missing-selector { 

Die (?<=\A|\}) stellt sicher, dass es nur noch (außer Leerzeichen) vor den { ist der Beginn des Strings oder eine Schließ }. (Danke an Casimir et Hippolyte für den Hinweis auf das Problem.)

Here's a regex101 demo.

Warum Ihr Versuch

fehlgeschlagen

Diese

/([^a-z0-9\)\];\-_]*\{)/i 

nicht tut, was Sie denken.

  • ( startet eine Erfassungsgruppe
  • [^a-z0-9\)\];\-_] ein anderes Zeichen als a-z erfordert, 0-9, ), ], ;, - oder _
  • * null oder mehrere Male
  • \{ die {
  • erfordert
  • ) beendet die Erfassungsgruppe

Aber es ist nicht ein ^ hat, so ist es nicht zu Beginn einer Linie gebunden, noch nicht bestätigen, was vor den { kommt (die nur der Anfang des Strings sein sollten , Whitespace oder }).Als Ergebnis wird es passen überall Sie eine Reihe von Leerzeichen oder andere nicht-alphanumerischen Zeichen (ohne )];-_) in Ihrer Probe CSS:

screenshot of regex101 demo

See this regex101 demo for a fuller explanation and example matches.

+0

Dank @EdCottrell, dies macht genau das, was ich brauche. Ich schätze die Erklärung auch sehr. – user2266497