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

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    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 régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    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 régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    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 régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    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.

  7. #7
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    J'ai adapté le code récursif du manuel pour arriver à ça

    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
     
    $myString = "Ce [BBC id='3vr']matin un lapin a [BBC id=4uy]tué[/BBC] un chasseur[/BBC]";
     
    function parseTagsRecursive($myString)
    {
        $regex = '#
        \[BBC \s+ 
        id=\'? (.+?) \'? \]
        ( (?: [^\[] | (?R) )+ )
        \[/BBC\]
        #ix';
     
        if (is_array($myString)) {
            $myAttribut = strtolower($myString[1]);
            $myValue = $myString[2];
     
            $myString = "<p class='xxx_$myAttribut'>%s</p>";
     
            switch($myAttribut) {
            case '3vr':
                $myString = sprintf($myString, strtoupper($myValue) );
                break;
            case '4uy':
                $myString = sprintf($myString, "[$myValue]" );
                break;
            default:
                $myString = sprintf($myString, $myValue );
                break;
            }
        }
     
        return preg_replace_callback($regex, 'parseTagsRecursive', $myString);
    }
     
    $output = parseTagsRecursive($myString);
     
    echo $output;

    La question qui reste est à choisir l'affichage : [TUE] ou [tué]

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut





    J'ai cependant du remplacer les p par des span et adapté à mon code

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    function bbCodeParserParseTagsRecursive($myString){
    $bbCodeFunctionUtils=new bbCodeFunctionUtils();
    $bbCodeCustomUtils=new bbCodeCustomUtils();
    $utilsCss=new utilsCss();
     
        $regex = '#
        \[BBC \s+ 
        id=\'? (.+?) \'? \]
        ( (?: [^\[] | (?R) )+ )
        \[/BBC]
        #ix';
     
        if (is_array($myString)) {
            $myAttribut = $myString[1];
            $myValue = $myString[2];
     
            $bbc=$bbCodeCustomUtils->getCustomBBCodeInfo($myAttribut);
        	if(!$bbc) return $myValue;
     
            $myString = "%s";
        	if(isset($bbc['t_params']['css'])){
    	 $myString = "<span class='bbc_$myAttribut'>%s</span>";
    	 $utilsCss->addCssClassToLoad('bbc_'.$myAttribut,$bbc['t_params']['css']);    	
    	}
     
       	$myString = sprintf($myString, $bbCodeFunctionUtils->getApplyFunctions($myValue,$myAttribut));
        }
     
        return preg_replace_callback($regex, 'bbCodeParserParseTagsRecursive', $myString);
    }
    La question qui reste est à choisir l'affichage : [TUE] ou [tué]


    En fait la mise en majuscule était un exemple de fonction. Sur le serveur, je n'ai pas appliqué la mise en majuscule à cet ID. C'est à la demande. J'ai d'ailleurs remplacer le switch de ton code par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $myString = sprintf($myString, $bbCodeFunctionUtils->getApplyFunctions($myValue,$myAttribut));
    En fait les id des BBC sont des identifiants de ce que j'appel des customBBCode. Un custom BBC est créé par l'utilisateur via une interface web. Il peut ainsi définir le style et éventuellement une fonction de traitement de chaine.

    Comme fonction de traitement j'ai pour le moment:

    substr
    shuffle
    upper
    lower
    concat

    L'utilisateur peu évidemment combiner plusieurs fonctions

    Et je compte faire une fonction insertbbcregex qui permet d'appliquer au résultat d'un regex un bbcode. Par exemple, je veux que tous les chiffres de mon texte possède tel style, ou je veux que la première lettre de mon texte soit plus grande avec telle couleur... etc etc mais je n'ai pas encore terminé cette fonction. Le problème disons est que pour monsieur tout le monde, les regex c'est un peu trop compliqué. Déjà pour moi !

    L'avantage est qu'en faisait des BBCode basés sur les class css, ça allège fortement le poids du code html. L'utilisateur a la liste des ses BBcode directement dans l'éditeur texte. Comme cela c'est beaucoup plus rapide pour appliquer un style de son choix. J'ai maintenu des centralisations sur un forum et c'est le genre de truc qui m'aurait fait gagner beaucoup de temps. Evidemment les bbcodes traditionnel sont accéssibles également.

    Un grand merci pour ton aide, c'était comme tu l'as dit un beau challenge.

  9. #9
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Oué, c'était sympa.
    Mais attention, il reste un écueil et je n'ai pas eu le temps de me pencher dessus : tu ne peux insérer de caractère [ entre deux balises BBCode, sous peine de faire exploser le biniou.

    TODO...

  10. #10
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par jml94 Voir le message
    Oué, c'était sympa.
    Mais attention, il reste un écueil et je n'ai pas eu le temps de me pencher dessus : tu ne peux insérer de caractère [ entre deux balises BBCode, sous peine de faire exploser le biniou.

    TODO...
    Je crois que celle-ci est un peu plus costaude :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        $regex = '{
        \[BBC \s+                                   # ca commence par [BBC avec un ou des blancs
        id=\'? (.+?) \'? \]                         # capture de l\'attribut id avec ou sans quotes
        ( (?: [^\[] | \[ (?!/?BBC) | (?R) )+ )      # capture récursive de la valeur entre balises
        \[/BBC\]                                    # et ça finit par [/BBC]
        }Six';                                      # S pour optimiser le moteur, i pour la casse, x pour l\'espacement et les commentaires

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Ca fonctionne

    J'ai juste remplacé

    ( (?: [^\[] | \[ (?!/?BBCODE) | (?R) )+ )

    par

    ( (?: [^\[] | \[ (?!/?BBC) | (?R) )+ )


    Il y a encore ce cas :

    [BBC id='3zF']tu[BBC]é[/BBC]

    Soit je remplace avant traitements les [BBC] par [BBBC] et ensuite en fin de traitement je fais l'inverse. Soit on peut peut-être à l'aide du regex ignorer les [BBC]. Bon ensuite s'il y a une erreur dans les BBC c'est aussi à l'utilisateur de le comprendre. Normalement avec les BBC et leur phylosophie, on ne doit pas avoir énormément de BBC imbriqués et donc ça doit être clair. En tout cas plus clair que les BBcode traditionnels.


    EDIT : voila c'est fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $str=str_replace('[BBBC]','[BBC]',bbCodeParserParseTagsRecursive(str_replace('[BBC]','[BBBC]',$str)));

  12. #12
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    S'il y a une erreur dans la balance des crochets, je pense qu'on peut s'en sortir avec preg_match et quasiment la même expression.
    J'aurais même tendance à dire exactement la même, mais je n'ai pas le temps de tester.

    TODO...

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Je remonte le topic car j'ai un problème avec cette fonction. J'ai découvert un bug. Cela fait planter le serveur apache


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $str="B[bbc id='ert']";
     
    for($i=0;$i<391;$i++){
    $str.='A';
    }
     
    $str.='[/bbc]';
     
    $str=bbCodeParserParseTagsRecursive($str);

    Avec 391 ça plante pas. Mais > 391 ça plante. donc on dirait qu'à partir d'une certaine taille de la chaine, cela fait planter le script.

    J'ai essayé d'augmenter la mémoire maximum par script mais rien n'a changé.


    Le regex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        $regex = '{
        \[BBC \s+                                   # ca commence par [BBC avec un ou des blancs
        id=\'? (.+?) \'? \]                         # capture de l\'attribut id avec ou sans quotes
        ( (?: [^\[] | \[ (?!/?BBC) | (?R) )+ )      # capture récursive de la valeur entre balises
        \[/BBC\]                                    # et ça finit par [/BBC]
        }Six';                                      # S pour optimiser le moteur, i pour la casse, x pour l\'espacement et les commentaires
    Le code

    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
     
    function bbCodeParserParseTagsRecursive($myString){
    $regex = '{
        \[BBC \s+                                   # ca commence par [BBC avec un ou des blancs
        id=\'? (.+?) \'? \]                         # capture de l\'attribut id avec ou sans quotes
        ( (?: [^\[] | \[ (?!/?BBC) | (?R) )+ )      # capture récursive de la valeur entre balises
        \[/BBC\]                                    # et ça finit par [/BBC]
        }Six';  
     
        if (is_array($myString)) {
            $myString = transformation($myString[2],$myString[1]);
        }
     
        return preg_replace_callback($regex, 'bbCodeParserParseTagsRecursive', $myString);
    }

    Avec un preg_match_all, preg_replace cela fonctionne mais le preg_replace_callback bug. Y aurait-il une limite de taille dans les paramètres de 'bbCodeParserParseTagsRecursive'?

    A votre avis ?


    Merci,


    Sébastien,

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    En cherchant les éventuels bug php connu, il savère qu'il y a un bug quand on combine les variables globales et preg_replace_callback. Bug qui serait résolut dans php 5.2.10. Je suis en 5.2.9


    Cependant, je n'utilise pas de $GLOBALS ;-) et le problème ne survient que lorsque la chaine de caractère est trop longue

    Cela dependrait également de l'OS (je suis sous Vista Home)

  15. #15
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par vodnok Voir le message
    En cherchant les éventuels bug php connu, il savère qu'il y a un bug quand on combine les variables globales et preg_replace_callback. Bug qui serait résolut dans php 5.2.10. Je suis en 5.2.9


    Cependant, je n'utilise pas de $GLOBALS ;-) et le problème ne survient que lorsque la chaine de caractère est trop longue

    Cela dependrait également de l'OS (je suis sous Vista Home)
    Peux-tu nous donner le lien qui explique ce bug, j'ai la flemme de chercher ce matin.

  16. #16
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    J'ai essayé de tester, mais il me manque la fonction "transformation".

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    http://bugs.php.net/bug.php?id=44214


    Problème résolut dans le 5.9.10 MAIS je n'utilise pas de globals comme décrit dans le code du bug...

    Je ne pense pas que cela vient du bug. En attendant, j'ai mis un substr pour réduire la taille de la zone à parser.

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    J'ai essayé de tester, mais il me manque la fonction "transformation".

    J'ai fait un test sans fonction de transformation. Juste une return de la chaine et ca plante également

  19. #19
    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 : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Je suis sous 5.2.10, donc je ne peux pas t'aider vraiment, mais j'ai fait ce test qui fonctionne en ajoutant des quantificateurs et un groupement atomique, ce qui devrait réduire le backtracking

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <?php
    $str="Debut[bbc id='un']content1[bbc id='deux']content2+";
     
    for($i=0;$i<400;$i++){
    $str.='A';
    }
     
    $str.='[/bbc]content3[/bbc]';
     
    $str=bbCodeParserParseTagsRecursive($str);
     
    print_r($str);
     
    function bbCodeParserParseTagsRecursive($myString){
    $regex = '{
        \[BBC \s++                                  # ca commence par [BBC avec un ou des blancs
        id=\'? ([^\'\]]++) \'? \]                   # capture de l\'attribut id avec ou sans quotes
        ( (?> [^\[] | \[ (?!/?BBC) | (?R) )+ )      # capture récursive de la valeur entre balises
        \[/BBC\]                                    # et ça finit par [/BBC]
        }Six';
     
        if (is_array($myString)) {
            $myString = '#'.$myString[1].'#'.$myString[2];
        }
     
        return preg_replace_callback($regex, 'bbCodeParserParseTagsRecursive', $myString);
    }

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Cela est peut être dut au changement de mon portable il y a 1 mois. J'ai réinstallé WAMP et le dernier PHP sous un Vista Home. J'étais sous XP Pro avec un plus ancien PHP

    Hélas je ne sais pas mettre PHP 5.2.10 car j'utilise eaccelerator et je n'ai pas encore trouver la dll compatible.

    Merci de ton aide, je vais voir ce que donne ta proposition...


    [quelques minutes plus tard]

    J'ai testé et la modification permet de doubler la taille maximale. Je passe de 390 à 780 (+/-) caractères. Je n'ai pas bien saisi la différence entre les 2 regex mais je vois que tu as doubler certains ++. Serait-il possible d'augmenter encore la maximum et de limiter via le regex la taille de la chaine entre les balises.


    Je vais tester sur mon ancien portable la problème vient peut être de l'OS ou de la configuration de WAMP

    Encore mercie

Discussions similaires

  1. [RegEx] Regex récursif pour du bbCode
    Par 123quatre dans le forum Langage
    Réponses: 0
    Dernier message: 08/05/2010, 10h44
  2. Script pour effacement récursif
    Par Filippo dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/01/2005, 18h10
  3. Fermeture BBcode
    Par golgot13 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2004, 08h19
  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, 11h04
  5. idFTP.DirectoryListing récursif + TreeNode
    Par fredfred dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/07/2004, 16h53

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