Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

regex pour récuperer tous les codes couleur d'une feuille de style

4 réponses
Avatar
EBille
Bonjour,
je veux r=E9aliser un script pour extraire l'ensemble des codes
"couleurs" d'une feuille de style.
Je suis un gros d=E9butant en regex... l'expression a =E9t=E9 construite
autour de cette id=E9e (pour l'instant, j'abandonne les "symboliques"
white etc...) : la chaine commence par #, se termine par ; et contient
six caract=E8res dans la s=E9rie a =E0 z et 1 =E0 9 et =E7a donne =E7a (ne =
riez
pas) :
#^\#([0-9a-z]{2}){3}$;#i
mais =E7a ne fonctionne pas. Sans me donner la solution directement, est-
ce que quelqu'un peut me donner une piste ?
Cordialement,
Eb

4 réponses

Avatar
Clément
Bonjour,

Votre regex cherche si la chaîne de caractère commence par "#" et
comporte 6 caractères jusqu'à la fin.
Autant dire que si vous donnez votre css entière, ça ne passe pas (elle
n'a pas que 7 caractères non ? :))

Je ne donne pas la solution directement donc mais il faudrait une regex
qui signifierait "trouve moi toutes les parties qui contiennent "#" puis
des caractères numériques ou entre a et f (de g à z n'existe pas en
css). Les caractères sont entre 3 et 6 (vu qu'on peut écrire #fff ou
#ffffff pour avoir du blanc)"

Le i final peut être omis si vous mettez a-f et A-F (à ce moment
minuscule et majuscule seront déjà incluses) par contre, un m final
(pour multiligne peut être intéressant car votre css est certainement
sur plusieurs lignes ;))


Le 23/06/2012 08:32, EBille a écrit :
Bonjour,
je veux réaliser un script pour extraire l'ensemble des codes
"couleurs" d'une feuille de style.
Je suis un gros débutant en regex... l'expression a été construite
autour de cette idée (pour l'instant, j'abandonne les "symboliques"
white etc...) : la chaine commence par #, se termine par ; et contient
six caractères dans la série a à z et 1 à 9 et ça donne ça (ne riez
pas) :
#^#([0-9a-z]{2}){3}$;#i
mais ça ne fonctionne pas. Sans me donner la solution directement, est-
ce que quelqu'un peut me donner une piste ?
Cordialement,
Eb

Avatar
Bille
Bonjour,
Merci pour votre réponse !
Votre regex cherche si la chaîne de caractère commence par "#" et
comporte 6 caractères jusqu'à la fin.
Autant dire que si vous donnez votre css entière, ça ne passe pas (el le
n'a pas que 7 caractères non ? :))


C'est juste ! mais le script analysera la css ligne par ligne.

Je ne donne pas la solution directement donc mais il faudrait une regex
qui signifierait "trouve moi toutes les parties qui contiennent "#" puis
des caractères numériques ou entre a et f (de g à z n'existe pas en
css). Les caractères sont entre 3 et 6 (vu qu'on peut écrire #fff ou
#ffffff pour avoir du blanc)"


ca, je ne l'avais pas vu venir ! Mais je peux restructurer les
déclarations dans la css

Le i final peut être omis si vous mettez a-f et A-F (à ce moment
minuscule et majuscule seront déjà incluses) par contre, un m final
(pour multiligne peut être intéressant car votre css est certainement
sur plusieurs lignes ;))


Je ne trouve pas la solution, mais déjà mon script ne trouve pas #^#
$;# dans la chaine
background-color: #220099; font-size: small;
on verra ça en juillet à mon retour de vacances...
Merci encore
Eric
Avatar
Clément
Le 24/06/2012 08:34, Bille a écrit :
C'est juste ! mais le script analysera la css ligne par ligne.


Même ligne par ligne... ça ne commencera jamais par #xxxxxx mais genre
background-color ;)
ca, je ne l'avais pas vu venir ! Mais je peux restructurer les
déclarations dans la css


Si c'est une CSS à vous, oui. Mais prendre tous les cas en compte est
tout de même plus sûr.
Je ne trouve pas la solution, mais déjà mon script ne trouve pas #^#
$;# dans la chaine
background-color: #220099; font-size: small;


Normal, "^" signifie commence par, votre chaîne commence par
"background" pas "#".
De plus, à vérifier, mais je ne crois pas que le dièse soit à échapper.

on verra ça en juillet à mon retour de vacances...


Bonne vacance :)
Avatar
Olivier Miakinen
Bonjour,

Tout d'abord, puisque ta question ne concerne que les regexp seules et
pas du tout PHP, sache que tu aurais pu la poser sur le groupe consacré,
fr.comp.lang.regexp.

Je n'y fais pas suivre la discussion, mais n'hésite pas à repartir de
là-bas si tu as d'autres questions.

Le 23/06/2012 08:32, EBille a écrit :

je veux réaliser un script pour extraire l'ensemble des codes
"couleurs" d'une feuille de style.
Je suis un gros débutant en regex... l'expression a été construite
autour de cette idée (pour l'instant, j'abandonne les "symboliques"
white etc...) : la chaine commence par #, se termine par ; et contient
six caractères dans la série a à z et 1 à 9



<http://www.w3.org/TR/CSS2/syndata.html#color-units>

La chaîne commence par #, contient trois ou six caractères parmi les
lettres de A à F ou de a à f et les chiffres de 0 à 9, et ne se termine
pas forcément par un ; (cela peut être une espace, une tabulation, une
fin de ligne ou une accolade fermante }, je ne sais pas s'il y en a
d'autres possibles).

Je te suggère donc d'abandonner le caractère de fin, de récupérer dans
ta regexp le plus grand nombre possible de [0-9a-fA-F] et de les compter
ensuite pour voir s'il y en a 3 ou 6.

et ça donne ça (ne riez pas) :
#^#([0-9a-z]{2}){3}$;#i
mais ça ne fonctionne pas. Sans me donner la solution directement, est-
ce que quelqu'un peut me donner une piste ?



1) Comme l'a signalé Clément, tu dois supprimer de ta regexp le ^ de
début de ligne et le $ de fin de ligne puisqu'elle commence probablement
ailleurs qu'au début et finit sans doute avant la fin.

2) De toute manière, ça n'avait *aucune* chance de fonctionner quelle
que soit la ligne puisque « $; » est contradictoire : il demande à
ce qu'il existe un caractère « ; » *après* la fin de la ligne !

3) C'est parfois une bonne idée de prendre autre chose que // comme
délimiteurs de regexp, pour éviter de devoir échapper un / dans la
regexp elle-même. Mais là, non seulement tu n'as pas de / dans la
regexp (donc pas besoin de prendre autre chose), mais surtout tu as
un # dans la regexp, alors il me semble peu judicieux de choisir le
# comme délimiteur...

Cordialement,
--
Olivier Miakinen