Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec la métode replace()

bbcode

    10 avril 2009 à 14:14:13

    Bonjour à tous !

    Je vous montre d'abord ma fonction qui permet de remplacer divers motifs dans mon texte avant d'entrer dans les explications de mon problème :

    function TEXTtoHTML(texte){
    	// flèche gauche
    	texte = texte.replace(/</g,"&lt;");
    	// flèche droite
    	texte = texte.replace(/>/g,"&gt;");
    	// saut de ligne
    	texte = texte.replace(/\n/g,"<br>");
    	// espace
    	texte = texte.replace(/\s/g,"&nbsp;");
    	// souligné
    	texte = texte.replace(/\[s\](.+)\[\/s\]/g,"<span style=\"text-decoration: underline;\">$1</span>");
    	// gras
    	texte = texte.replace(/\[g\](.+)\[\/g\]/g,"<span style=\"font-weight: bold;\">$1</span>");
    	return texte;
    }
    


    Lorsque je tape le texte suivante :

    [s]salut[/s] [s]ca va[/s]


    J'obtiens ce résultat :

    salut[/s] [s]ca va

    En fait dans le cas d'une balise [g] ou [s], le motif commence à partir de la première balise et finis à la dernière ne prenant donc pas en compte tout ce qu'il y a au milieu.

    Pourriez-vous m'indiquer où je me suis trompé ou oublié quelque chose ?
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2009 à 14:17:27

      texte = texte.replace(/\[s\](.+?)\[\/s\]/g,"<span style=\"text-decoration: underline;\">$1</span>");

      (J'ai rajouté un ? apres le +)
      Mais t'auras toujours un autre problème, dans le cas où tu as [s][s]abc[/s][/s]

      Un autre sujet est en cours pour ce probleme, je t'invite a le suivre =o
      http://www.siteduzero.com/forum-83-390 [...] mbriquee.html
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2009 à 14:29:27

        Non, il s'agit plutôt je pense de l'option Ungreedy qui est manquante :
        texte = texte.replace(/\[s\](.+)\[\/s\]/gU,"<span style=\"text-decoration: underline;\">$1</span>");
        	// gras
        	texte = texte.replace(/\[g\](.+)\[\/g\]/gU,"<span style=\"font-weight: bold;\">$1</span>");
        

        Il y a donc un U après le petit g.
        Tiller .+? => revient à .* et c'est plus propre.
        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2009 à 14:38:46

          Sauf que U n'existe pas en Javascript :D
          Et pour simuler le U, il faut faire comme j'ai fais =o
          • Partager sur Facebook
          • Partager sur Twitter
            10 avril 2009 à 14:51:58

            Kyle t'es out là...

            Citation : Kyle


            Tiller .+? => revient à .* et c'est plus propre.



            Pour faire .+ en Ungreedy, tu fais .+? et pour faire .* en Ungreedy, tu fais .*?

            EDIT : Petite précision. Ca inverse la gourmandise, car le "?" s'applique sur le ".+" (ou ".*") et non pas simplement sur le "+" (ou "*")...
            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2009 à 15:35:45

              Pourriez vous expliquer à l'inculte que je suis de quoi vous parlez ? >_<
              Ungreedy (pas "radin" en anglais d'accord... mais à part ça...) c'est quoi ?
              Quel est l'intérêt du .+? ?
              .? c'est 0 ou 1 fois n'importe quoi...
              .+ c'est 1 ou plus de fois n'importe quoi...
              .* c'est 0, 1 ou plus de fois n'importe quoi...
              Mais .+? c'est quoi ?
              N'importe quoi 1 ou plusieurs fois présent ou pas ?

              Si c'est inutiles, (ce qui ne doit pas être le cas vu que c'est vous qui en parlez), je suppose que ça sert à dire que c'est le même caractère qui se répète plusieurs fois... ou un truc du genre... mais j'apprécierais que vous m'expliquiez cette subtilité...
              • Partager sur Facebook
              • Partager sur Twitter
                10 avril 2009 à 15:51:07

                bon alors, l'option ungreedy, c'est "Pas gourmand" en fait.
                Par exemple /a.*b/U (Le U de ungreedy, marche en PHP mais pas en js)

                Pour 'a ert b defg b', sans le U sa renvoi 'a ert b defg b', Il est gourmand, il prend le plus possible, avec le U il prend 'a ert b'. Il s'arrête à la première occurence.

                Après pourquoi en rajoutant un ? en JS ça marche.. J'avoue je sais pas. Mais je sais que ça marche xD
                • Partager sur Facebook
                • Partager sur Twitter
                  10 avril 2009 à 15:56:17

                  ah !
                  Donc le ? sert à "simuler" le U ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 avril 2009 à 16:06:07

                    Oui, en quelques sortes... C'est la méthode JS pour faire du Ungreedy.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 avril 2009 à 16:31:48

                      Et bah merci :p
                      Je me sent moins stupide depuis que je sais ça :p
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 avril 2009 à 19:27:37

                        J'ai une autre question...
                        Il faut le mettre à chaque fois qu'on mets un +, un - ou un {x,y} ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 avril 2009 à 19:52:02

                          Montre le cas précis... parce que là je comprends pas trop...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 avril 2009 à 20:33:21

                            J'ai cette chaîne :

                            yii yii yaa yaa bla

                            Et je veux que ça récupère

                            yii yii yaa yaa

                            donc je dis
                            yi*ya*

                            Pour simuler le U,
                            il faut que je rajoute un ? après chaque * ou une seule ?
                            Et si jamais c'est un ? à la place de l'*, on en rajoute un ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 avril 2009 à 0:33:36

                              Euh... bah moi je mettrais même pas de point d'interrogation...

                              Je ferais...

                              var reg = /(yi*)*(ya*)*/;
                              

                              (Je ne considère pas les espaces que tu as mis dans la chaîne d'exemple...)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 avril 2009 à 10:34:34

                                Bah alors ça sert à quoi Ungreedy >_<
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 avril 2009 à 10:59:18

                                  Je pense que tu as mail choisi ton exemple xD

                                  Alors... si tu as ... cette chaîne de code

                                  <i>Bla blabla!</i> Yop ! <i>Bliii</i>


                                  Pour le parser, tu pourrais être tenté d'utiliser une Regexp de style...
                                  /<i>(.+)<\/i>/g;

                                  Regardons donc le code de notre parsage et son résultat :

                                  var chaine = "<i>Bla blabla!</i> Yop ! <i>Bliii</i>";
                                  var reg = /<i>(.+)<\/i>/g;
                                  chaine = chaine.replace(reg,"<em>$1</em>");
                                  
                                  alert(chaine);
                                  // Et là c'est le drame, car chaine vaut...
                                  // "<em>Bla blabla!</i> Yop ! <i>Bliii</em>"
                                  


                                  La regexp est bien trop gourmande, elle a tout pris au lieu de séparer les différentes zones.
                                  Il faut donc passer en mode Ungreedy !

                                  On cale dans la regexp le petit "?" qui va bien :
                                  /<i>(.+?)<\/i>/g;

                                  Et tadaaa :

                                  var chaine = "<i>Bla blabla!</i> Yop ! <i>Bliii</i>";
                                  var reg = /<i>(.+?)<\/i>/g;
                                  chaine = chaine.replace(reg,"<em>$1</em>");
                                  
                                  alert(chaine);
                                  // Et là magiiiiie 
                                  // "<em>Bla blabla!</em> Yop ! <em>Bliii</em>"
                                  





                                  Alors, maintenant je vais essayer de trouver un exemple adapté à ta question précédente...
                                  Non bah en fait j'en trouve pas... >_<
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    11 avril 2009 à 12:11:38

                                    Je pense que j'ai compris ^^
                                    Merci !
                                    Donc en fait, si on veux parser qqch, il faut toujours y fare en Ungreedy... pour le BBcodes etc.
                                    Et le mode Greedy, c'est si tu ne veux en prendre qu'un... le plus long possible...
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Problème avec la métode replace()

                                    × 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