2016-02-26 27 views
8

Próbuję przekształcić nieprawidłowy CSS tak:Regex dodać brakujące selektorów na nieprawidłowe CSS

{color:red}

i sprawiają, że ważny jak ten:

.missing_selector{color:red}

Przykład 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;} 
} 

Mój obecny Wyrażenie regularne:

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

żywo Test:

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

+0

Tylko podpowiedź, a nie odpowiedź, ale może ta biblioteka pomaga: https://github.com/sabberworm/PHP-CSS-Parser Rozwiązanie z samym regexem jest raczej podatne na błędy, jak przypuszczam. – Jan

+0

Możesz spróbować ['/^\h*\K(?={)/m'](https://regex101.com/r/mC7pI5/1) i zastąpić' .missing_selector' –

Odpowiedz

6

Rozwiązanie

Trzeba to wykorzystać:

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

Replace with:

.missing-selector { 

(?<=\A|\}) zapewnia, że ​​nie tylko sprawa (inne niż białe znaki) przed { jest początkiem łańcucha lub zamykania }. (Dzięki Casimir et Hippolyte za wskazanie problemu.)

Here's a regex101 demo.

Dlaczego Twoja próba nie powiodła

Ten

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

nie robić to, co myślisz.

  • ( rozpoczyna grupę przechwytywania
  • [^a-z0-9\)\];\-_] wymaga znak inny niż a-z, 0-9, ), ], ;, - lub _
  • * zero lub więcej razy
  • \{ wymaga {
  • ) kończy grupy przechwytywania

Ale to nie ma ^, więc to nie jest przywiązany do początku wiersza, ani nie zatwierdza co przychodzi przed { (który powinien być dopiero początek łańcucha , białe znaki lub }).W efekcie będzie on pasował wszędzie masz serię spacji lub innych znaków innych niż alfanumeryczne (z wyłączeniem )];-_) w swojej próbki CSS:

screenshot of regex101 demo

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

+0

Dzięki @EdCottrell, to robi dokładnie to, czego potrzebuję. Naprawdę doceniam również wyjaśnienie. – user2266497