Expression regulière

Stef -  
 Stef -
Bonjour,
Je n'arrive pas a construire une xepression regulire qui me rend pour un style donné et un type donné sa valeur.
Exemple pour la feuille suivante j'aimerais obtenir #A3C1E0
pour le style .stylebleu et le type background-color avec une expression reguliere.

Merci de vos réponses

.stylebleu {
background-color: #A3C1E0;
}

.styleMenu {
color: #FFFFFF;
background-color: #3A76B1;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
A voir également:

11 réponses

sebsauvage Messages postés 33415 Statut Modérateur 15 667
 
En Python, et hop...

css = """
.stylebleu {
background-color: #A3C1E0;
}

.styleMenu {
color: #FFFFFF;
background-color: #3A76B1;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
"""
import re
regexp = re.compile("\.stylebleu\s*?{.*?background-color:(.+?);.*?}",re.DOTALL|re.IGNORECASE)
print regexp.search(css).group(1)
1
sebsauvage Messages postés 33415 Statut Modérateur 15 667
 
Petite correction:
"\.stylebleu.*?{.*?background-color:(.+?);.*?}"
1
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

et son cousin en Perl
sebsauvage a utilisé une variable; moi j'ai écrit le contenu dans un fichier .css que je l'écrit en argument .

Execution : script fichier.css
#! /usr/bin/perl

use warnings;
local $/; # mode slurp (le fichier est avalé dans une variable scalaire)

$t=<>; # on utilise le fichier .css en tant qu'argument

print $1,"\n" if $t=~/.stylebleu\s*{.*?background-color:\s*(.*?);.*?}/si;

modificateur i pour insensibilté à la casse
modificateur s pour mode une seule ligne (le . reconnaît aussi le \n )

lami20j
1
kilian Messages postés 8854 Statut Modérateur 1 526
 
Sous php, pour utiliser ces expressions régulières tu ne peux pas prendre ereg, il faut prendre preg_match ou preg_match_all

? signifie une fois ou pas.

donc .*? signifie
"tout caractère, autant de fois qu'on veux mais une seule fois".

Bizzare hein? Et bien c'est logique en fait, si tu appliques:

.*m

pour la chaine " / - g f m p" il ne s'arrêtera pas à m mais il ira jusqu'au bout, puisqu'on lui a dit tout caractère autant de fois qu'on veut juste avant.

Si tu mets:

.*?m

pour la même chaine, il prendra " / - g f m" car il arrêtera son expression .* dés qu'il trouvera un m.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

? c'est un quantificateur qui veut dire facultativ

ab?c reconnaît ac mais aussi abc

Dans la construction .*? a une autre signification. Il s'agit des quantificateur * paresseux.

Exemple

"popup =~ /p(.*)p/ # on capture opu
et

"popup =~ /p(.*?)p/ # on capture o

Je ne connaît pas php. Pour m'amuser j'ai fait un script qui fait une recherche progressive dans menu.css et trouve toutes les correspondances.
Je ne sais pas si en php ou python il y a l'assertion \G
#! /usr/bin/perl

use warnings;
my %h;
local $/; # mode slurp

$t=<>; # on utilise le fichier .css en tant qu'argument

while ($t =~ /.style(\w+?)\s*{.*?background-color:\s*/sig){
  my $c = $1;
  $t =~ /\G(#\w+)/ and $h{$c} = $1;
}

foreach (sort keys %h) {
 print "style$_ : $h{$_}\n";
}
Le fichier menu.css
[lamitest@localhost my_perl_script]$ cat menu.css
.stylebleu {
background-color: #A3C1E0;
}

.styleMenu {
color: #FFFFFF;
background-color: #3A76B1;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
.stylePerso {
background-color: #AFC1B0;
}

.styleNewMenu {
color: #FFFFFF;
background-color: #AA76BA;
background-position: center center;
text-align: center;
vertical-align: middle;
text-transform: none;
}
[lamitest@localhost my_perl_script]$
Le résultat
[lamitest@localhost my_perl_script]$ perl regex_stef_ccmG.pl menu.css
styleMenu : #3A76B1
styleNewMenu : #AA76BA
stylePerso : #AFC1B0
stylebleu : #A3C1E0
[lamitest@localhost my_perl_script]$
lami20j
1
kilian Messages postés 8854 Statut Modérateur 1 526
 
Arg, finalement je me reprsentait pas si bien que ça le .*?

Sympa ce petit cours, le perl reste toujours aussi incompréhensible pour moi d'ailleurs.
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > kilian Messages postés 8854 Statut Modérateur
 
Salut kilian,

comme j'étais en train de t'adresser un petit message pendant que tu as déjà écrit un....


En Perl .*? veut dire de prendre n'importe quel caractère mais de se contenter avec le minimal qui le satisfait

Voilà 3 cas :
"exigence" =~ /e(.*)e/ ; capture de xigenc

"exigence" =~ /e(.*?)e/; capture de xig

"exigence" =~ /.*e(.*?)e/; capture de nc
Pour ton cas *.m, c'est vrai que la regex avale tout mais ensuite elle est obligé de s'incliner quant'à la reconnaissance de m donc elle va céder un caractère pour que l'expression réussie en totalité.

Bien sûr ça depende aussi du moteur utilisé par le regex.

a+,
lami20j
0
kilian Messages postés 8854 Statut Modérateur 1 526 > kilian Messages postés 8854 Statut Modérateur
 
Ok, j'avais bien saisi le truc dans ton explication d'avant.
Mais c'est surtout la syntaxe du perl, pour moi c'est du Kanji :-)
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > kilian Messages postés 8854 Statut Modérateur
 
Ben, le jour ou tu voudras apprendre kanji et je pourrai t'aider, je le ferai avec plaisir.

lami20j
0
kilian Messages postés 8854 Statut Modérateur 1 526 > kilian Messages postés 8854 Statut Modérateur
 
Merci :-)
0
Stef
 
Ok merci
Je vais essayer .
0
Stef
 
merci encore de vos réponse.
Mais que signifie le ? car sous php cela ne passe pas ?
0
Stef
 
"pour la chaine " / - g f m p" il ne s'arrêtera pas à m "
C'est donc pour cela qui'il me prenait la derniere occurence de background-color: avec mon expression reguliere !
Merci encore, je vais essayer avec preg_match .
0
Stef
 
J'aimerais remplacer le resultat par la valeur #FFFFFF comment faire en PHP ?
0
Stef
 
Désolé pour le message précédent je me suis emmélé le clavier.
J'ai essayer avec preg_replace mais je n'y arrive pas.
Si quelqu'un pouvait m'aider ???
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

regarde ici http://www.expreg.com/eregreplace.php

lami20j
0
Stef
 
J'ai esayer avec echo preg_replace('\.stylebleu.*?{.*?background-color:(.+?);.*?}' ,"\\1",$chaine,1); mais j'ia cette erreur :
Warning: Delimiter must not be alphanumeric or backslash
Est-ce que quelqu'un a une idée ?
Merci de vos réponses
0