Partage
  • Partager sur Facebook
  • Partager sur Twitter

Regex

Petit soucis de construction

Anonyme
    27 novembre 2005 à 12:43:11

    Rebonjour tout le monde,

    Je suis toujours en train de faire mon site, et je me sus attaqué aux regex, jai réussi a en faire la plupart, mais une me résiste, je la ocnstruit surement mal, ais après ces 4heures de codage, le mal de crâne guette, donc je sollicite votre aide :)
    Voila ma regex foireuse:

     $texte = preg_replace('!\[[a=(http://[a-z0-9._/-]+!i\][\/a\]]', '<a href="$1"></a>', $texte);


    Alors les petites explications sur mon code

    Alors les petites explications sur mon code.
    Le but de cette regex est de transformer ceci:

    Citation : Pas de titre

    [a=http://lien.machin][/a]


    en cela:

    Citation : Pas de titre

    <a href="http://lien.machin"></a>



    Mon texte reçus est $texte et le texte ou il odit remplacer est donc bien sûr $texte

    Je vais continuer a chercher, j'èspère que vous pourrez m'aider,
    D'avance merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2005 à 12:55:21

      Je ne vois pas pourquoi tu ne refermes pas ta parenthèse dans la regex.
      • Partager sur Facebook
      • Partager sur Twitter
        27 novembre 2005 à 12:56:02

        $texte = '[a=http://lien.machin][/a]';
        $texte = preg_replace('#\[a=(http://[a-z0-9._/-]+)\]\[/a\]#i', '<a href="$1">$1</a>', $texte);
        echo $texte;

        Voilà, j'ai testé ça fonctionne mais bon, je ne l'ai pas améliorée non plus, je me suis juste contenté de la faire marcher hein. :)
        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2005 à 13:05:20

          <?php
          $chaine='un texte et une url [a=http://lien.machin][/a] voilou';
          echo preg_replace('`\[a=(http://[^]]+)]\[/a]`i','<a href="$1">$1</a>',$chaine);
          ?>


          Ps aux DEV du SDZ :
          Pourquoi l'antislash et le crochet sont-ils colorés en bleu et en gras dans mon masque ?
          Aucun intérêt de mettre cette partie plus en valeur que d'autre.
          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2005 à 13:30:35

            A Yves : c'est pour plus de lisibilité, c'est parceque c'est un caractère échapé et donc ça peut aider lors des oublis de ce côt là :)
            Tien, grâce à cette mise en valeur je viens de voir que tu as fait une erreur :
            tu as oublié d'échapé deux "]".
            La bonne syntax (d'après celle d'Yves)

            <?php
            $chaine='un texte et une url [a=http://lien.machin][/a] voilou';
            echo preg_replace('`\[a=(http://[^]]+)\]\[/a\]`i','<a href="$1">$1</a>',$chaine);
            ?>

            :p
            et en améliorant un peu :

            <?php
            $chaine='un texte et une url [a=http://lien.machin][/a] voilou';
            echo preg_replace('`\[a=(http://[^]]+)\]([^]])\[/a\]`i','<a href="$1">$2</a>',$chaine);
            ?>

            ;)


            Bisous, Nyu
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              27 novembre 2005 à 13:59:29

              Merci beaucoup, je vais tester ca et je dis quoi :p
              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2005 à 14:02:08

                Ouaip don je modifie un peu mon truc :
                <?php
                $chaine='un texte et une url [a=http://lien.machin][/a] voilou';
                echo preg_replace('`\[a=(http://[^]]+)\]([^<])\[/a\]`i','<a href="$1">$2</a>',$chaine);
                ?>

                Donc la ce seront les < qui ne passeront plus mais ce n'est pas grâve puisqu'auparavant, il ont été transformé en &lt; grâce à un htmlentities (enfin j'espère pour toit sinon c'est du suicide ton script :p )


                Biszous, Nyu
                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2005 à 14:03:52

                  Citation : Dutiona

                  A Yves : c'est pour plus de lisibilité, c'est parceque c'est un caractère échapé et donc ça peut aider lors des oublis de ce côt là :)
                  Tien, grâce à cette mise en valeur je viens de voir que tu as fait une erreur :
                  tu as oublié d'échapé deux "]".
                  La bonne syntax (d'après celle d'Yves)


                  Sorry, je n'ai absolument rien oublié, ma regex fonctionne très bien ! ;)

                  Citation : Dutiona


                  et en améliorant un peu :


                  <?php
                  $chaine='un texte et une url [a=http://lien.machin][/a] voilou';
                  echo preg_replace('`\[a=(http://[^]]+)\]([^]])\[/a\]`i','<a href="$1">$2</a>',$chaine);
                  ?>


                  ;)


                  Non !
                  Elle est fausse et ne fonctionnera pas. ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 novembre 2005 à 14:06:33

                    Et pourquoi ? explique :)
                    Moi j'ai juste rajouté des \ avant des ] qui doivent être pris comme tel et pas comme classe de caractère.
                    Sinon une nouvelle spécification perl vient ébranlé les cours même qui sont tur ton site, argumente un peu voir.
                    A moin que la faute ne soit pas là :D et dans ce cas alors j'aimerai que tu me dises où elle est pour ne pas la reffaire.

                    EDIT: Ok j'ai oublié le quantificateur mais je croit pas que c'était sur ça que tu disais que ça marcherait pas.

                    EDIT: Voilà alors ce que je propose :
                    <?php
                    $chaine='un texte et une url [a=http://lien.machin]blablabla[]...==[/a] voilou';
                    echo preg_replace('`\[a=(http://[^]]+)\]([^<])+\[/a\]`i','<a href="$1">$2</a>',$chaine);
                    ?>

                    Où est l'erreur :) ?


                    Bisous, Nyu
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 novembre 2005 à 14:11:42

                      Citation : Dutiona

                      Et pourquoi ? explique :)
                      Moi j'ai juste rajouté des \ avant des ] qui doivent être pris comme tel et pas comme classe de caractère.
                      Sinon une nouvelle spécification perl vient ébranlé les cours même qui sont tur ton site, argumente un peu voir.
                      A moin que la faute ne soit pas là :D et dans ce cas alors j'aimerai que tu me dises où elle est pour ne pas la reffaire.

                      Où est l'erreur :) ?



                      Ce qui m'ennuie c'est que tu n'as même pas testé ma regex !!!!
                      Tu as vu qu'il manquait des \ et tu n'as pas été plus loin.
                      Il n'y a pas besoin d'échapper une classe qui n'existe pas.
                      [a-z] est une classe de caratère
                      \[a-z] n'est pas une classe de caractères puisque le premier crochet est échappé.

                      Voilà, l'explication est simple.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 novembre 2005 à 14:13:42

                        Ok merci de la précision :) mais je préfererais échaper les 2 dans un souci de clareté de ma regex, enfin chaqu'un sa façon de coder :)


                        Bisous, Nyu
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          27 novembre 2005 à 14:14:53

                          En fait, la regex fonctionne tres bien, seulement, je crois qu'elle empiète sur d'autre :euh:
                          Je vais vous montrer toutes les regex que j'ai:

                          $texte = preg_replace('!\[g\](.+)\[/g\]!isU', '<strong>$1</strong>', $texte); // Pour mettre en gras
                          $texte = preg_replace('!\[i\](.+)\[/i\]!isU', '<em>$1</em>', $texte); //Pour mettre en italique
                          $texte = preg_replace('!\[s\](.+)\[/s\]!isU', '<span style="text-decoration: underline;">$1</span>', $texte); //Pour souligner
                          $texte = preg_replace('!\[sub\](.+)\[/sub\]!isU', '<sub>$1</sub>', $texte); //pour mettre en indice
                          $texte = preg_replace('!\[sup\](.+)\[/sup\]!isU', '<sup>$1</sup>', $texte); //pour mettre en exposant
                          $texte = preg_replace('!\[a=(http://[^]]+)\]([^]])\[/a\]!isU','<a href="$1">$2</a>',$texte); //Pour les liens
                          $texte = preg_replace('!\[c=(#[a-z0-9]{6})\](.+)\[/c\]!isU', '<span style="color:$1">$2</span>', $texte); //couleur du texte
                          $texte = preg_replace('!\[f=(#[a-z0-9]{6})\](.+)\[/f\]!isU', '<span style="background-color:$1">$2</span>', $texte); //couleur de fond du texte


                          Voila, donc le probleme, c'est que si je met ce genre de texte:

                          Citation : Pas de titre


                          [a=http://lien.com][c=#FFFFFF][g][i][/i][/g][/c][/a]



                          bah alors certaines chaines ne sont pas transformée.
                          A mon avis, c'est a cause des symboles [ ], mais je n'en suis pas sur.

                          J'ai bien trouvé une idée qui fontcionne, mais a mon avis il y a surement plus simple.

                          Enfin voila toujours mon idée:
                          Remplacer les balises ouvrantes et fermantes par des regex séparées, une pour ouvrir, une pour fermée.
                          Par exemple pour le [a=http://lien.com][/a]

                          Ca donnerait:

                          $texte = preg_replace('!\[a=(http://[^]]+)\]!','<a href="$1">',$texte); //On remplace les balises ouvrantes
                          $texte = preg_replace('!\[/a\]!isU', '</a>', $texte); //On remplace les balises fermantes


                          Evidemment c'est relativement plus long, mais ça a l'air de fonctionner très bien o_O
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 novembre 2005 à 14:15:51

                            Citation : Dutiona

                            Ok merci de la précision :) mais je préfererais échaper les 2 dans un souci de clareté de ma regex, enfin chaqu'un sa façon de coder :)



                            Que tu le code comme ça, c'est ton droit, mais ne dis pas aux autres que ma regex est fausse.
                            Par contre, celle que tu as donnée en EDIT dans ton post précédent est encore fausse !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 novembre 2005 à 14:16:40

                              Qu'est ce qu'il va pas alors ?
                              Qu'elle est la faute ? je la vois pas o_O


                              Bisous, Nyu
                              • Partager sur Facebook
                              • Partager sur Twitter

                              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