Partage
  • Partager sur Facebook
  • Partager sur Twitter

Générateur de phrases : problème de regex

    20 septembre 2006 à 14:07:44

    Salut à tous.

    Voila dans le cadre d'un jeu j'aimerai varier les phrases. J'ai pour cela trouvé un moyen. Ecrire des phrases du type :

    Citation : Modèle de phrase

    Hey, [bonjour|salut|ça va] toi !?
    Ou :
    Salut, [comment tu vas ?|ça gaz ?|tu vas bien ?|je suis Odile Deray.]


    Ca fonctionne bien, en me lâchant une phrase en prenant l'une des expressions de la liste.

    Mais voila le problème, si je fais une phrase comme

    Citation : Modèle de phrase


    Hey, [bonjour|salut|], [comment tu vas ?|ça gaz ?|tu vas bien ?]


    Alors la c'est le drame.

    je vous présente ma fonction de parse :
    function composer($phrase){
            if(preg_match('#\[(.+)\]#isU', $phrase, $reg)){ // S'il y à [xxxxx] dans la phrase.
                   
                    $x = explode('|', nettoyer($reg[0])); // la fonction nettoyer() enlève les [ et ] des chaînes.
                    $nbr = count($x);              
                    $rand = rand(0, $nbr-1);
           
                    // Remplacement de [...|...] par l'un des mots.
                    $phrase = preg_replace('#\[(.+)\]#', $x[$rand], $phrase);
                    return $phrase;
            }
    }
    echo composer("Hey, [salut|bonjour toi].");


    Le problème vient sans nul doute de l'array $reg mais je ne sais pas comment m'y prendre pour que 0 soit remplacé par la bonne occurence.

    Sauriez-vous m'aider ?


    Sephi-Chan

    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2006 à 14:09:18

      tu peux peut être utiliser un preg_match_all, puis une boucle sur les résultats retournés.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        20 septembre 2006 à 14:30:20

        Pourquoi des regex?
        function composer($phrase){
                $p1 = 0;
                $p2 = 0;
                while($p1 !== false) {
                        $x = substr($phrase, ($p1 = strpos($phrase, '[')), ($p2 = strpos($phrase, ']'))-$p1+1);
                        $replace = explode('|', nettoyer($x));
                        $phrase = str_replace($x, $replace[rand(0, count($replace)-1)], $phrase);
                }
                return $phrase;
        }
        echo composer("Hey, [salut|bonjour toi], [comment|ca] vas?[Aujourd'hui|hier]");
        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2006 à 14:51:10

          Je dois reconnaître que c'est assez super. Même si je ne comprends pas tout.

          Le seul hic c'est que ça prend le même mot aléatoire de la liste, par exemple le deuxième.

          Pour mieux visualiser :
          echo composer("Hey, [1|2], [1|2] va ? Tu as fais quoi [1|2] ? Moi j'ai [1|2].");

          Va sortir :

          Citation : Test

          Hey, 1, 1 va ? Tu as fais quoi 1 ? Moi j'ai 1.
          ou alors
          Hey, 2, 2 va ? Tu as fais quoi 2 ? Moi j'ai 2.


          Mais pas un mix de 1 et de 2.


          Pense-tu qu'il y a une solution à ça ?
          Si ce n'est pas le cas merci beaucoup de l'aide apporté, je vais tenter de mieux comprendre le script.


          Sephi-Chan
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            20 septembre 2006 à 15:03:10

            Alors, euh, en fait, c'est logique, vu que je remplace [1|2] par sa valeur avec str_replace, lors du premier tour de boucle, tous les [1|2] sont remplacé d'un coup

            J'ai peut-être une idée pour l'en empêcher, je vais voir ca.
            • Partager sur Facebook
            • Partager sur Twitter
              20 septembre 2006 à 15:04:49

              C'est très sympa de ta part de m'aider.

              Merci vraiment.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                20 septembre 2006 à 15:10:34

                Tadam!
                Ca fonctionne :D
                function composer($phrase){
                        $p1 = 0;
                        $p2 = 0;
                        while($p1 !== false) {
                                $x = substr($phrase, ($p1 = strpos($phrase, '[')), ($p2 = strpos($phrase, ']'))-$p1+1);
                                $replace = explode('|', nettoyer($x));
                                $phrase = str_replace(($deb = substr($phrase, 0, $p1)).$x, $deb.$replace[rand(0, count($replace)-1)], $phrase);
                        }
                        return $phrase;
                }
                echo composer("Hey, [1|2], [1|2] va ? Tu as fais quoi [1|2] ? Moi j'ai [1|2].");
                • Partager sur Facebook
                • Partager sur Twitter
                  20 septembre 2006 à 15:17:51

                  Fantastique ! /kiss

                  Merci beaucoup, grâce à ça les description seront moins monotones.

                  Accepterait-du d'expliquer un peu le fonctionnement du script ?


                  Sephi-Chan
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 septembre 2006 à 15:23:55

                    Pourquoi ne pas tout simplement utiliser un array() ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      20 septembre 2006 à 15:25:11

                      euh, c'est pas simple à expliquer, mais j'ai commenter comme je pouvais
                      function composer($phrase){
                              //on initialise $p1 et $p2 à 0 pur éviter de se prendre un undefined variable au premier tour de boucle
                              //$p1 contient l'offset du [ qu'on traite
                              //$p2 contient l'offset du ] qu'on traite
                              $p1 = 0;
                              $p2 = 0;
                              //si strpos() ne trouve pas le caractère qu'on cherche, il renvoie false, donc tant que $p1 ne vaut pas false, on continue la boucle
                              while($p1 !== false) {
                                              //On récupère le partie de la phrase qui contient les options( [1|2] par exemple )
                                              //Au passage on réassigne leur nouvelles valeurs à $p1 et $p2 pour continuer la boucle
                                  $x = substr($phrase, ($p1 = strpos($phrase, '[')), ($p2 = strpos($phrase, ']'))-$p1+1);
                                              //On crée un talbeau qui contient toutes les options avec explode
                                  $replace = explode('|', nettoyer($x));
                                              //On remplace dans la phrase de départ tout ce qui est avant les options qu'on traite  par tout ce qu'il y a avant les options concaténer avec l'option déterminée par le rand
                                  $phrase = str_replace(($deb = substr($phrase, 0, $p1)).$x, $deb.$replace[mt_rand(0, count($replace)-1)], $phrase);
                              }
                                      //enfin on retourne le tout
                              return $phrase;
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 septembre 2006 à 15:28:27

                        Merci beaucoup. Je comprend un peu ;). Encore quelques lectures et ça rentre ;).


                        Sephi-Chan
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 septembre 2006 à 15:29:41

                          I repeat : why don't use a array() ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 septembre 2006 à 15:40:13

                            Parce que ce système est plus "flex" ?

                            Or moi je stop sur mon flex.


                            Sephi-Chan, tout simplement.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 septembre 2006 à 15:50:22

                              Citation : Sephi-Chan

                              Parce que ce système est plus "flex" ?

                              Or moi je stop sur mon flex.


                              Sephi-Chan, tout simplement.


                              Mouaaaaarf ! :lol:
                              Soit honnête et dis-nous plutôt que tu ne sais pas te servir d'un tableau ! ^^
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 septembre 2006 à 16:10:06

                                C'est quoi cette provoc' à deux balles la -_-...

                                Je me sers souvent d'array pour mes jeux... C'est juste que je n'en vois pas l'intérêt ici.

                                J'ai dans ma base de données les phrases de chaque page du livre avec des mots alternatifs.

                                Ainsi j'ai un texte dynamique pour varier les phrases de mes PNJs, des descriptions de lieux et tout.


                                Sephi-Chan
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 septembre 2006 à 16:23:51

                                  Citation : Sephi-Chan

                                  C'est quoi cette provoc' à deux balles la -_-...


                                  Si tu le dis !
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 septembre 2006 à 17:27:12

                                    Ce n’est pas la question.

                                    C'est juste que j'aimerai savoir pourquoi tu préconises l'array. Je n'en cerne pas l'utilité, mais sans doute as-tu ton idée à ce sujet.
                                    C'est pourquoi j'aimerai que tu développes.


                                    Sephi-Chan
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Générateur de phrases : problème de regex

                                    × 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