IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

expression ne fonctionne pas à tous les coup [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut expression ne fonctionne pas à tous les coup
    Bonjour,

    J'ai une PCRE qui ne marche pas à tous les coup et je ne comprend pas pourquoi

    Mon PCRE -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $letexte = preg_replace("`<span style=\"background-color: ?([^]]*) ?;\"> ?([^]]*) ?\</span\>`", "[bgcolor=\\1]\\2[/bgcolor]", $letexte);
    Fonctionne avec : <span style="background-color: #33cccc;">qsfdsfdsfdfds</span>

    Mais pas avec : <span style="background-color: #33cccc;">qsfdsfdsfdfds</span><span style="background-color: #33cccc;">qsfdsfdsfdfds</span>

    Quand deux <span se suivent ....

    Quelqu'un pourrait il m'aider ?
    Écoute, sinon ta langue te perdra (proverbe Navajo)

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Quand il se produit ce genre de choses, c'est à cause du caractère glouton d’un quantificateur * ou +.

    Il faut donc chercher ces quantificateurs dans la RE (regular expression) et examiner si ce qu'ils "multiplient" peut provoquer, lors du parcours de la chaîne testée, une avancée au delà de la longueur de chaîne sur laquelle on pensait que ça allait matcher.



    Dans le cas d’une recherche de matching de ta RE sur la chaîne
    '<span style="background-color: #33cccc;">qsfdsfdsfdfds</span><span style="background-color: #33cccc;">qsfdsfdsfdfds</span>' :


    le premier groupe ([^]]*) de la RE va matcher à partir du premier ’#33cccc’ dans la chaîne examinée, puis va continuer de matcher dans ’;">qsfdsfds....’ sans entrave parce que les caractères rencontrés dans ’;">qsfdsfds....’ ne sont pas des ’]’.

    Et il continue et avance tant qu’il peut.

    Il irait bien jusqu’au bout de la chaîne s’il le pouvait. Mais il ne le peut pas, à cause du fait que ce qui suit ce premier groupe, c’est à dire ’ ?;\"> ?([^]<]*) ?\</span\>’ dans la RE doit matcher avec quelque chose.

    Donc le premier groupe fait avancer le moteur de recherche jusqu’à la deuxième occurence ’#33cccc’ ,
    puis la suite de la RE matche avec la suite de la deuxième occurence ’#33cccc’

    D’où les deux groupes matchant

    '#33cccc;">qsfdsfdsfdfds</span><span style="background-color: #33cccc'

    et

    'qsfdsfdsfdfds'







    Correction de ton problème:

    ajouter le limitateur de gloutonnerie ? après le quantificateur * dans le premier groupe ([^]]*) ==> ([^]]*?)


    Le hic c’est que maintenant, bien sûr le moteur de regex s’arrête devant la première chaîne matchant ’ ?;\"> ?’ juste apres la première occurence ’#33cccc’ , mais c’est le second groupe qui cette fois fait aller le matching plus loin que voulu, jusqu’au deuxième ’qsfdsfdsfdfds’



    De ce fait les deux groupes matchent cette fois

    '#33cccc'

    et

    'qsfdsfdsfdfds</span><span style="background-color: #33cccc;">qsfdsfdsfdfds'



    Il faut donc mettre aussi un ? derrière * dans le deuxième groupe ([^]]*) ==> ([^]]*?)

    Et donc la RE:
    <span style=\"background-color: ?([^]]*?) ?;\"> ?([^]]*?) ?\</span\>

  3. #3
    Membre actif Avatar de elcoyotos
    Homme Profil pro
    Amateur passionné
    Inscrit en
    Octobre 2006
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Amateur passionné

    Informations forums :
    Inscription : Octobre 2006
    Messages : 490
    Points : 294
    Points
    294
    Par défaut
    Que dire ?
    C'est rapide, clair, limpide, bien expliqué

    Mille merci eyquem

    PS : Ca n'a jamais été mon fort les regex
    Écoute, sinon ta langue te perdra (proverbe Navajo)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remove item qui ne fonctionne pas à tout les coups ?
    Par Elharion dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/02/2012, 18h26
  2. Mon diaporama ne s'affiche pas à tous les coups !
    Par dekaki dans le forum jQuery
    Réponses: 2
    Dernier message: 17/11/2011, 09h08
  3. TRegistry qui ne fonctionne pas à tout les coups
    Par davels dans le forum Composants VCL
    Réponses: 6
    Dernier message: 06/05/2011, 02h00
  4. [PHP 5.2] Shell_exec ne marche pas à tous les coups
    Par stundman dans le forum Langage
    Réponses: 3
    Dernier message: 14/04/2010, 17h21
  5. [XP] Bips au démarrage - ne démarre pas à tous les coups
    Par kevain_09 dans le forum Windows XP
    Réponses: 3
    Dernier message: 25/06/2007, 20h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo