Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bug regex ou pas

Si quelqu'un a une idée

    16 septembre 2018 à 9:24:29

    Bonjour à tous,

    Je lance un nouveau post ne sachant trop ou classé cette demande.

    J'ai remarqué un probleme en testant différent combinaison d'après le cours de m@teo21 sur le php et le sql à la rubrique 1 sur les regex.

    il est dit:

    je veux permet 2 mots au choix (soit l'un soit l'autre)

    #guitare|piano#       ----> ca marche

    Seulement plus loin dans les symboles sur les quantificateurs, il parle de:  "chien ou chiens" comme ceci

    #chiens?#

    OK, ca marche, et donc j'ai voulu aller plus loin en y ajoutant le feminin

    #chiens?|chiennes?#   ------> et la ca ne marche pas, je fais plus simple

    #chien|chienne#   ------> ca ne marche toujours pas, j'inverse au cas ou et la...

    #chienne|chien#   ---------> ca marche!

    J'ai aussi essayé:

    chie(n|nne)s?      ------> ca ne marche toujours pas, mais pour....

    chie(nne|n)s?   -----------> ca marche

    Bien entendu, j'aurais pu faire:

    chien(ne)?s?

    Mais afin d'égailler mes connaissances, je préfère demander.

    A croire que en cas de choix multiples il faut que le choix le plus long soit présenté en premier dans le cas de caractères commun au 2 choix.

    En vous remerciant

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2018 à 10:14:34

      Bonjour,

      On sait pas ce que tu soumets à tes regex, donc difficile de t'en dire plus. Qu'entends-tu plus précisément par "ne marche pas", qu'attends-tu comme comportement ?

      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        16 septembre 2018 à 17:06:56

        Hello.

        FrancoisPessard a écrit:

        A croire que en cas de choix multiples il faut que le choix le plus long soit présenté en premier dans le cas de caractères commun au 2 choix.

        Oui et c'est le traitement attendu d'un "if(a||b)" en programmation sauf qu'on attend pas d'un "if(a||b)" de sélectionner ce qui a satisfait la condition... mais on peut tout de même émuler

        $data = 'chiennes';
        if( ($match = substr($data, 0, 5)) == 'chien' || ($match = substr($data, 0, 7)) == 'chienne' ) echo $match, '<br>'; // chien
        if( ($match = substr($data, 0, 7)) == 'chienne' || ($match = substr($data, 0, 5)) == 'chien' ) echo $match, '<br>'; // chienne
        if( ($match = substr($data, 0, 4)) == 'chat' || ($match = substr($data, 0, 8)) == 'chiennes' ) echo $match, '<br>'; // chiennes
        

        Par contre si on cherche un mot complet et qu'une frontière tel que \b est suffisante, alors l'ancrage \b facilitera la tâche du "if regexp" qui backtrack-era pour chercher une solution... mais c'est toujours la première alternative à satisfaire la condition finale de gauche à droite comme un "if(a||b||c||etc)".

        $data = 'un chien et une chienne font des chiots femelles ou mâles selon le chromosome Y qui ne sera pas autrichien ici.';
        if(preg_match_all('#\bch(ien|ienne|iot)s?\b#', $data, $match)) {
          print_r($match[0]); // Array ( [0] => chien [1] => chienne [2] => chiots )
        }
        

        https://3v4l.org/JT5DI

        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2018 à 10:20:49

          Merci pour cette réponse,

          Concernant le deuxième exemple, si je comprend bien c'est PARCE QU'IL Y A l'ancrage \b que le Regex est lu intégralement avant de commencer la recherche (Backtrack) et donc le problème des chaines dont on a parlé précédemment ne se pose pas.

          PS: désolé pour cette réponse tardive.

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            18 octobre 2018 à 16:28:42

            Lorsque le mot "chienne" est rencontré dans la chaine source la première alternative "ien" sera satisfaite, donc il y aura poursuite et tentative de matcher \b qui est la frontière \w\W ou \W\w ce qui sera un échec car  "nn" est une frontière \w\w entre autre. Donc backtracking, soit retour sur la troisième lettre du mot "chienne" (donc "ienne") dans la chaine source et retour sur l’alternative dans l'expression pour tenter la seconde alternative qui est "ienne". Car sans cet ancrage dans l'expression, il va de soit que les 4 premières lettres de "chienne" sont "chien", l'ancrage opérera pour "autrichien" car \b précédent "ch" produira un échec immédiat sur le test "ic" qui est encore une fois une frontière \w\w.

            -
            Edité par Anonyme 18 octobre 2018 à 16:30:33

            • Partager sur Facebook
            • Partager sur Twitter
              20 octobre 2018 à 8:43:49

              ok compris avec un peu de mal mais compris merci
              • Partager sur Facebook
              • Partager sur Twitter

              Bug regex ou pas

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown