2010-09-30 6 views
0

Qu'est-ce qu'une expression régulière qui peut être utilisée pour valider un sélecteur CSS, et peut le faire de telle sorte qu'un sélecteur invalide s'arrête rapidement.Expression régulière qui valide un sélecteur CSS

sélecteurs valides:

EE 
#myid 
.class 
.class.anotherclass 
EE .class 
EE .class EEE.anotherclass 
EE[class="test"] 
.class[alt~="test"] 
#myid[alt="test"] 
EE:hover 
EE:first-child 
E[lang|="en"]:first-child 
EE#test .class>.anotherclass 
EE#myid.classshit.anotherclass[class~="test"]:hover 
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hover 

sélecteurs non valides, par exemple contenir des espaces supplémentaires à la fin de la ligne:

EE:hover EE 
EE .class EEE.anotherclass 
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hov  9 
EE#myid.classshit.anotherclass[class="test"]:first-child EE.Xx:hov -daf 
+2

Vous pourriez être en mesure d'écrire un RE pour cela, mais êtes-vous sûr que l'écriture d'un analyseur de grammaire ne serait pas mieux? – zigdon

+0

J'étais sur le point de poster une réponse à votre autre question mais vous l'avez supprimée. –

+0

* "Les sélecteurs invalides, par exemple, contiennent des espaces supplémentaires à la fin de la ligne:" * Quelle ligne serait-ce? Je n'ai jamais rencontré un analyseur CSS (par exemple, pour un fichier CSS, un attribut de style, etc.) qui avait des problèmes avec les espaces de fin. –

Répondre

3

Les expressions régulières sont l'outil incorrect. Les sélecteurs CSS sont complexes. Exemple:

bo\ 
dy:not(.\}) {} 

Utilisez un analyseur avec un vrai tokenizer comme celui-ci: PHP-CSS-Parser. Il est plus facile de le réécrire sur Java que d'avoir une regex correcte.

0

Le problème avec votre expression régulière typique est qu'ils sont incapables de gérer des niveaux d'imbrication arbitraires. Ils n'ont pas de mémoire. Considérons une chaîne d'un nombre de a suivi du même nombre de b: aaabbb et une expression rationnelle a*b*. Quand l'expression rationnelle arrive au premier 'b', elle n'a pas de mémoire combien elle reconnaît et donc elle ne peut pas reconnaître le même nombre de b.

maintenant remplacer a et b avec ( et ), IF et END, <x> et </x> etc ... et vous pouvez voir le problème.

+0

Je me souviens de Jeff Atwood en train de parler de ne pas écrire un analyseur XML avec RegEx pour cette raison.Je demandais juste au sujet du sélecteur qui a une grammaire simple. Exemple: tag # id.aClass.anotherClass: pseudo-classe [matching = "element"]. Ce qui pourrait avoir un deuxième sélecteur fourni mais tant qu'il y en a un ou plusieurs vous en foutez. – Sarabjot

1

Il est une expression régulière que je l'utilise dans mes codes:

[+>~, ]?\s*(\w*[#.]\w+|\w+|\*)+(:[\w\-]+\([\w\s\-\+]*\))*(\[[\w ]+=?[^\]]*\])*([#.]\w+)*(:[\w\-]+\([\w\s\-\+]*\))* 

Après sous forme de jeton utiliser la fonction de garniture pour supprimer les espaces supplémentaires, par exemple:

expression:

EE.class  EE#id.class 

jetons:

EE.class 

    EE#id.class 

jetons après garniture:

EE.class

EE # id.class

OU par exemple

> EE.class (alerte quand il est un enfant direct, je traite avec un code de sous-chaîne)

D'autres routines peuvent vérifier si jeton est un numéro par exemple Vous pouvez utiliser http://regexpal.com/ pour les tests.

Questions connexes