Partage
  • Partager sur Facebook
  • Partager sur Twitter

[RegExp] Comment ne pas parser mes balises entre les balises {code} et {/code} ?

    19 juin 2006 à 14:39:39

    bonjour :)

    c'est encore moi :D

    mais cette fois ci, j'ai un nouveau problème ! :(

    c'est en fait que je vais sûrement créer un fichier langage dans GeSHi pour mon langage qui est le BasiCode !

    Or, j'ai des smileys et des balises que je ne voudrais pas parser dans les balises code !

    comment serai-ce possible de faire ca avec des regexp de type PCRE (sans parser XML).

    voici une de mes RegExp :

    ${$variable} = preg_replace('!\{italique\}(.+)\{/italique\}!isU', '<i>$1</i>', ${$variable});


    si vous conaissez un bon tuto sur diablotron (un parser xml), vous pouvez le dire aussi :D

    merki d'avance ;)

    ++
    • Partager sur Facebook
    • Partager sur Twitter
      19 juin 2006 à 14:53:36

      Tes explications ne sont pas très claires. o_O

      Par contre, concernant ta portion de code, comme je n'ai pas envie de me disputer avec toi, je vais attendre que d'autres prennent le relais, on verra bien. ^^
      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2006 à 15:01:35

        bah qu'est-ce qu'il a mon code ? o_O

        il as toujours marché !!!

        mais le problème est que je sais pas comment faire pour empêcher le parsage entre les balises {code} et {/code}

        Genre :

        je met ca :

        {gras}Salut !{/gras}

        Citation : Ca donne :

        Salut !



        je met ca :
        {code=autre}{gras}Salut !{/gras}{/code}

        Citation : Ca donne :

        {gras}Salut !{/gras}


        est-ce que je me suis bien expliqué ? :D

        merki d'avance

        ++
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2006 à 15:10:41

          htmlspecialchars ca irait non?

          Sinon, pour ta regex, utilise plutot ` (alt gr + 7) pour délimiter plutot que !
          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2006 à 16:41:48

            nan, avec les ` ca marche pas !!!

            sinon moi je veux pas que ca mette les balises html de retour dans la balise code mais les balises basicode carrément : en fait je veux que ca parse rien dans la balise code excepté GeSHi mais ca je m'en chargerai de l'exception :)

            voici ma fonction :

            function basicode($variable) {
                    global ${$variable};
                   
                    /*************************************************
                    ************* Parser BasiCode ***************
                    ****************** Par php5 *******************
                    *************************************************/

                   
                    // Liste des codes à détecter comme valides dans la balise {code} :
                    $codes_geshi = "actionscript|csharp|matlab|qbasic|ada|mpasm|smarty|apache|css|nsis|sql|asm|delphi|objc|vbnet|asp|diff|oobas|vb|bash|d|oracle8|vhdl|caddcl|html4strict|pascal|visualfoxpro|cadlisp|java|perl|xml|c_mac|javascript|php-brief|c|lisp|php|cpp|python";
                   
                    // Ici on crée l'array des masques de regexp
                    $masque = array(
                            #### Mise en forme de base ####
                            '`\{gras\}(.+)\{/gras\}+`isU' => '<b>$1</b>',
                            '`\{italique\}(.+)\{/italique\}+`isU' => '<i>$1</i>',
                            '`\{souligne\}(.+)\{/souligne\}+`isU' => '<u>$1</u>',
                            '`\{couleur=([a-z]{1,}|#[A-Fa-f0-9]{6}+)\}(.+)\{/couleur\}+`isU' => '<font color="$1">$2</font>',
                            '`\{centre\}(.+)\{/centre\}+`isU' => '<div style="text-align: center;">$1</div>',
                            '`\{droite\}(.+)\{/droite\}+`isU' => '<div style="text-align: right;">$1</div>',
                            '`\{gauche\}(.+)\{/gauche\}+`isU' => '<div style="text-align: left;">$1</div>',
                            '`\{surligne=([a-z]{1,}|#[A-Fa-f0-9]{6}+)\}(.+)\{/surligne\}+`isU' => '<font style="background-color: $1;">$2</font>',
                            '`\{barre\}(.+)\{/barre\}+`isU' => '<strike>$1</strike>',
                            #### Sémantique ####
                            '`\{titre=(1|2+)\}(.+)\{/titre\}+`isU' => '</p><h$1>$2</h$1><p>',
                            #### Liens automatiques ####
                            '`(?<=^|\s)((http|ftp|irc|ed2k)\://[a-zA-Z0-9._/-?=%|]+)(?=\s|$)`' => '<a href="$1">$1</a>',
                            #### Blocs ####
                            // Code (non-geshi - personnalisés)
                            '`\{code=autre\}(.+)\{/code\}+`isU' => '</p><div class="bloc_geshicode"><span class="titre_geshicode">Code : autre</span><div class="geshicode"><pre>$1</pre></div></div><p>',
                            '`\{code\}(.+)\{/code\}+`isU' => '</p><div class="bloc_geshicode"><span class="titre_geshicode">Code : autre</span><div class="geshicode"><pre>$1</pre></div></div><p>',
                            '`\{code=console\}(.+)\{/code\}+`isU' => '</p><div class="bloc_geshicode"><span class="titre_geshicode">Code : console</span><div class="code_console"><pre>$1</pre></div></div><p>',
                            // Citations
                            '`\{citer=(.+)\}(.+)\{/citer}+`isU' => '</p><div class="bloc_citation"><span class="titre_citation">Citation : $1</span><div class="citation">$2</div></div><p>',
                            // Spoiler
                            '`\{spoiler\}(.+)\{/spoiler\}+`isU' => '</p><div class="bloc_spoiler"><span class="titre_spoiler">Spoiler (cliquez pour afficher)</span><div class="spoiler2" onclick="switch_spoiler(this);"><div class="spoiler3">$1</div></div></div></p>',
                            #### Définitions ####
                            '`\{definition=(.+)\}(.+)\{/definition\}+`isU' => '<acronym title="$1">$2</acronym>',
                            #### Objets ####
                            '`\{email=([a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}+)\}(.+)\{/email\}+`isU' => '<a href="mailto:$1">$2</a>',
                            '`\{taille=([0-7]{1}+)\}(.+)\{/taille\}+`isU' => '<font size="$1">$2</font>',
                            '`\{image\}([A-Za-z0-9éèàêâùïüë -_:=&;%/.?]+)\{/image\}+`isU' => '<img src="$1" alt="Image" />',
                            '`\{lien=((http|ftp|irc|ed2k)\://[a-zA-Z0-9-._ /?=|%]+)\}(.+)\{/lien\}`isU' => '<a href="$1">$3</a>',
                            '`\{lien=([A-Za-z0-9-_=&;%#./?]+)\}(.+)\{/lien\}`isU' => '<a href="$1">$2</a>',
                            #### Notifications ####
                            '`\{note=attention\}(.+)\{/note\}`isU' => '</p><div class="bc_attention">$1</div><p>',
                            '`\{note=info\}(.+)\{/note\}`isU' => '</p><div class="bc_information">$1</div><p>',
                            '`\{note=question\}(.+)\{/note\}`isU' => '</p><div class="bc_question">$1</div><p>',
                            '`\{note=erreur\}(.+)\{/note\}`isU' => '</p><div class="bc_erreur">$1</div><p>',
                            #### Remplacements divers ####
                            '`<p><br />`' => '<p>',
                            '`<br /></p>`' => '</p>'
                    );
                   
                    // Une fois les masques définis, on les parse en explorant l'array() grâce à foreach()
                   
                    $nbr_parsages=0; // Pour compter le nombre de parsages BasiCode on initialise une variable à 0
                    foreach($masque AS $regexp => $result) {
                           
                            if(${$variable} = @preg_replace($regexp, $result, ${$variable})) { // Parsage en PCRE
                                    $nbr_parsages++; // On ajoute 1 à la variable une fois chaque parsages faits
                            }
                            else {
                                    ${$variable} = '<div class="bc_erreur">Une erreur est survenue pendant le parsage BasiCode !</div>';
                                    break;
                            }
                    }
                   
                    // On écrit en commentaire HTML le nombre de parsages :
                   
                    echo '<!-- ' . $nbr_parsages . ' parsages de balises BasiCode ont été effectués pour générer ce message -->';
                   
                    #### Ici on parse certaines balises qui requierts des fonctions avec preg_replace_callback() ####
                    // Les flottants
                    ${$variable} = preg_replace_callback('!\{flottant=((droite|gauche)+)\}(.+)\{/flottant\}+!isU', 'div_flottant', ${$variable});
                    // Coloration synthaxique des codes
                    ${$variable} = preg_replace_callback('!\{code=(' . $codes_geshi . '+)\}(.+)\{/code\}+!isU', 'colore_code', ${$variable});
                   
                    #### Parsage des smileys ####
                    ${$variable} = smileys_parse(${$variable});
            }


            PS : le parser XML que j'ai c'est SABLOTRON :p et pas DIABLOTRON ^^

            ++
            • Partager sur Facebook
            • Partager sur Twitter
              22 juin 2006 à 21:20:48

              UP pour l'aider car je l'apprecis ce petit :p
              • Partager sur Facebook
              • Partager sur Twitter

              Web Developer

                22 juin 2006 à 22:44:11

                En utilisant l'extension DOM XML c'est beaucoup plus simple ;) Et ça permet d'économiser le serveur, parce que les regex...

                Citation : php5

                nan, avec les ` ca marche pas !!!


                Ca marche très bien, sisi.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juin 2006 à 14:39:16

                  Citation : 6(sic)6

                  En utilisant l'extension DOM XML c'est beaucoup plus simple ;) Et ça permet d'économiser le serveur, parce que les regex...

                  Citation : php5

                  nan, avec les ` ca marche pas !!!


                  Ca marche très bien, sisi.



                  j'ai matté des sources de kayl avec sablotron pour parser le zcode, et c'est super galère rien que pour 1 balise !!!

                  et j'ai essayé avec les ` mais ya rien à faire ca veut pas faire de l'imbrication !!!!!

                  faut utiliser des preg ou des ereg d'abord ? des ! ou des ` ?
                  autre chose ? une class ?

                  merci de votre aide ;)

                  ++
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juin 2006 à 23:58:25

                    Pour l'imbrication c'est un peu compliqué avec des regex. J'ai déjà testé avec le XSLT, et le problème vient du fait que la transformation n'est pas directement faite par PHP, par contre ce n'est rien de très compliqué. DOM XML est assez pratique, c'est d'ailleurs ce que j'ai gardé pour le (fumeux je sais) bbCode. Tu peux aller voir par exemple sur ce topic.

                    PS : Quand on parle d'utiliser ` au lieu de ! ça ne change rien à la regex hein, c'est juste que les assertions utilisent aussi le ! ;)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 juin 2006 à 0:49:45

                      si je met `a la balise code et ! aux autres elles seront pas parsées au milieu de {code} et {/code} c'est ca ? o_O

                      ++
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 juin 2006 à 1:06:11

                        Nan, rien à voir ^^ Les ` et ! sont juste des délimiteurs, mais l'inconvénient du ! c'est d'être utilisé par certaines assertions, et donc elles ne pourront pas être utilisées dans les regex car le ! sera considéré comme la fin de ton masque. Mais va plutôt voir ici ;)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [RegExp] Comment ne pas parser mes balises entre les balises {code} et {/code} ?

                        × 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