Expression regulière

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;
}

11 réponses

  1. 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
    1. 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
    2. J'aimerais remplacer le resultat par la valeur #FFFFFF comment faire en PHP ?
      0
      1. "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
        1. Modérateur
          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
          1. Modérateur
            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
          2. Modérateur
            @kilianSalut 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
          3. Modérateur
            @kilianOk, 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
          4. Modérateur
            @kilianBen, le jour ou tu voudras apprendre kanji et je pourrai t'aider, je le ferai avec plaisir.

            lami20j
            0
          5. Modérateur
            @kilianMerci :-)
            0
        2. Modérateur
          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
          1. merci encore de vos réponse.
            Mais que signifie le ? car sous php cela ne passe pas ?
            0
            1. Modérateur
              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
              1. Modérateur
                Petite correction:
                "\.stylebleu.*?{.*?background-color:(.+?);.*?}"
                1
                1. Modérateur
                  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