2011-11-18 5 views
2

J'essaie de faire correspondre certaines propriétés CSS. Cependant, je ne peux pas prédire l'ordre dans lequel ils seront enPHP RegEx: correspondre à une liste dans un ordre inconnu

Exemple:.

header p { 
color:#f2f3ed; 
background-color:#353535; 
background-image: url(../images/dots.png); 
} 

Cependant, je dois aussi attendre:

header p { 
background-image: url(../images/dots.png); 
background-color:#353535; 
color:#f2f3ed; 
} 

Et toute autre combinaison de ces trois propriétés. L'application web que nous sommes en train de construire me donne seulement accès à la fonction preg_match.

Quelqu'un sait-il comment faire correspondre toutes les combinaisons possibles de propriétés? Je sais exactement ce que les propriétés seront, je ne sais pas quel ordre ils vont venir.

Dire que je suis en train de trouver une solution plus rapide que de taper sur toutes les combinaisons possibles et la séparation avec |

+2

Vous devez utiliser un analyseur CSS à la place des expressions régulières uniquement ici. – hakre

+0

Vous pouvez également appeler 'preg_match' plusieurs fois, une fois pour chaque propriété que vous souhaitez associer, mais un analyseur est la meilleure solution si ce code doit être conservé ou utilisé par d'autres utilisateurs. – jswolf19

+0

J'ai essayé de construire une regex pour cela, mais il a frit mon nouilles avec le sélecteur à l'avant avec de nombreuses allumettes au milieu. – Scuzzy

Répondre

1

le super-Imprécision mais aussi approche bêtement-facile serait d'utiliser une liste d'alternatives:

/ (\s* color:#\w+; | \s* bbb:... | \s* ccc:...){3} /x 

le quantificateur {3} veillera à ce que trois des alternatives sont présentes, et l'ordre ne sera pas question.

Cela permettrait cependant à trois propriétés color: de correspondre. Vous devrez décider si cela est assez important, ou si c'est assez peu probable que quelqu'un écrira trois déclarations color: consécutives dans vos déclarations CSS.

1

Regex for existence of some words whose order doesn't matter

Cela fonctionne, grâce à l'opérateur de préanalyse (? =).

/^(?=.*(?:color|background-color|background-image)\:.*?;).*/gm 

ou des commentaires

^   # beggining of line 
(?=   # positive lookahead (true if pattern present after current position; in this case the beginning of current line) 
    .*   # anything before the pattern we search for 
    (?:color|background-color|background-image)\:  # match any of those 3 sequences followed by : char 
    .*?;  # anything followed by ; but not looking beyond the first ; found 
) 
.*   # match the rest of the chars from where the (?=) was found. 
/gmx   # MODIFIERS: global, multi-line, extended (for comments, ignores spaces and anything after #) 

Vous pouvez essayer ici:.

https://regex101.com/r/tX0hK3/1

Le^avant (= * est très important pour l'efficacité Sinon, le moteur! essayerait la recherche une fois pour chaque position

La fin. * (Ou. + Ou. ++, possessif) est juste pour faire correspondre la ligne maintenant nous avons trouvé le bon contenu.

Questions connexes