IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[BBCode] preg_replace_callback récursif


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Par défaut [BBCode] preg_replace_callback récursif
    Bonjour à tous,

    J'ai un petit soucis et je pense que Regex est la solution.

    Voici mon problème, j'ai un string qui peut éventuellement contenir des balises de type [BBC id='3vr']contenu[/BBC].

    Exemple :

    Ce [BBC id='3vr']matin[/BBC] un lapin a [BBC id='4uy']tué[/BBC] un chasseur

    Ce que désire c'est remplacer les BBC par des <p class='xxx_3vr'>matin</p> mais également appliquer une modification sur la chaine comme par exemple

    <p class='xxx_3vr'>MATIN</p> (majuscule)
    <p class='xxx_4uy'>[tué]</p> (entourer le texte de crochet)

    Pour ajouter les p class, il n'y a pas de problème mais c'est pour appliquer une fonction au contenu de la balise en fonction du paramètre de la balise qui me pose problème.

    Voici une piste possible :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    $code='$this->callBack1($matches[0],$matches[1]);';
     
    $l_regex="";
     
    	$str=preg_replace_callback(
            stripslashes($l_regex),
            create_function(
                '$matches',
                'return '.$code
            ),
            $str
       );
    $code est le code à appliquer dans le callback
    $l_regex est ... le regex


    Comme vous le voyez, l'idée est, via preg_replace_callback, pour chaque résultats trouvés, d'exécuter une fonction callBack1 en passant comme paramètre le contenu de la balise et l'id.


    Je sèche sur le regex pour qu'il sorte le contenu et l'id pour que je puisse fournir cela à la fonction callBack1


    Avez vous une idée pour régler le problème ou peut être une autre voie. J'ai en stock PEARL et son plugin BBCodeParser.


    Merci,


    Vodnok

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Par défaut
    Voici un regex qui me retourne l'id et le contenu

    $l_regex= '`\[BBC id=(.*)\](.*)\[/BBC\]`';

    Mais il gère ma les BBC imbriqués

    Exemple

    [BBC id=3vt]gé[BBC id=3vu]ni[/BBC]al[/BBC]

    donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    preg_match_all($l_regex,$str,$pre);
     
    PRE =
    Array(3) {
       [0]=>'Array(1) {
          [0]=>'[BBC id=3vt][BBC id=3vu]ni[/BBC]al[/BBC]'
       }
     
       [1]=>'Array(1) {
          [0]=>'3vt]gé[BBC id=3vu]ni[/BBC'
       }
     
       [2]=>'Array(1) {
          [0]=>'al'
       }
     
    }

    Grrrr

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Salut,

    J'ai fait un truc pour le callback

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <?php
     
    function testRegex($myString) {
        $pattern = '#\[BBC \s+ id=\'? ( [^\']+ ) \'? \] ( [^\[]* ) \[/BBC\]#ix';;
        print preg_replace_callback($pattern, "format", $myString);
    }
     
    function format($matches) {
        $myAttribut = $matches[1];
        $myValue = $matches[2];
     
        $buffer = "<p class='xxx_$myAttribut'>%s</p>";
     
        switch($myAttribut) {
        case '3vr':
            $buffer = sprintf($buffer, strtoupper($myValue) );
            break;
        case '4uy':
            $buffer = sprintf($buffer, "[$myValue]" );
            break;
        default:
            $buffer = sprintf($buffer, $myValue );
            break;
        }
     
        return $buffer;
    }
     
    $myString = "Ce [BBC id='3vr']matin[/BBC] un lapin a [BBC id=4uy]tué[/BBC] un chasseur";
     
    /* Resultat attendu:
    
    <p class='xxx_3vr'>MATIN</p> (majuscule)
    <p class='xxx_4uy'>[tué]</p> (entourer le texte de crochet)
    
    */
     
    testRegex($myString);

    Reste à gérer les imbrications.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Par défaut
    Merci beaucoup,

    Effectivement pour les imbrications c'est compliqués. J'ai regardé le code de BBCodeParser dans PEARL et si j'ai bien compris avant de traiter, il crée un arbre des tag function _buildTagArray() mais ça m'a l'air bien complexe et couteux en ressource pour faire cela.

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    A vrai dire, je n'ai jamais plongé dans le code d'un parser de BBCode. Ca pourrait être intéressant.
    Je pensais plutôt regarder du côtés de la recursivité, qui peut aussi être un beau challenge.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Par défaut
    Voila j'ai adapté ma classe de traitement avec ton code.



    matin reçoit une class css et un traitement qui est un shuffle
    tué reçoit une class css et un traitement qui est un ajout de texte en début et fin de texte.



    Mais reste le problème des imbrications.


    $myString = "Ce [BBC id='3vr']matin un lapin a [BBC id=4uy]tué[/BBC] un chasseur[/BBC]";


    Il faudrait un regex qui extrait le contenu de la première balise cad : matin un lapin a [BBC id=4uy]tué[/BBC] un chasseur. Et ensuite on applique à cette chaine la fonction précédente. Mais j'ai un doute de la faisabilité avec regex. Le [/BBC] est très ennuyant.

Discussions similaires

  1. [RegEx] Regex récursif pour du bbCode
    Par 123quatre dans le forum Langage
    Réponses: 0
    Dernier message: 08/05/2010, 09h44
  2. Script pour effacement récursif
    Par Filippo dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/01/2005, 17h10
  3. Fermeture BBcode
    Par golgot13 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2004, 07h19
  4. XPATH XSL Récursif (très débutant!)
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 24/08/2004, 10h04
  5. idFTP.DirectoryListing récursif + TreeNode
    Par fredfred dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/07/2004, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo