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 et fonctions


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
    Novembre 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 155
    Par défaut BBcode et fonctions
    Bonjour,
    j'utilise une fonction BBCODE qui lorsqu'elle trouve un script comme ceci:

    Voici ma fonction:

    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
     
    function BBCode($var)
    {
       //Code
       $bbcode[8]['Search'] = "!\[code\](.+)\[/code\]!isU";  
       $bbcode[8]['Replace'] = "$1";
     
       foreach($bbcode as $bbcode_str)
       {
          if($bbcode_str['Search']=="!\[code\](.+)\[/code\]!isU")
           {
           $debtablo="<table style=\"color:blue\" width=\"90%\" cellspacing=\"0\" cellpadding=\"0\" border=\"1\" align=\"center\" class=\"stile\">
           <tr><td class=\"stile\"><font color=black><b>Code:</font></b></td></tr>
           <tr><td class=\"quote\" class=\"stile\"><font size=2>";
     $milieu=$bbcode_str['Replace'];
      $fintablo="</font></td></tr></table>"; 
           $total=$debtablo.$milieu.$fintablo;
     
          $var = preg_replace($bbcode_str['Search'],$total,$var);
           }
           else
           {
     
            $var = preg_replace($bbcode_str['Search'],$bbcode_str['Replace'],$var);
           }
       }
       return $var;
    }
    Tout ceci marche parfaitement, pour mes autres balises (gras,italique etc...) et aussi pour les scripts , cela me les mets dans un tableau.

    Le problème est que j'essaye d'appliquer une fonction de coloration aux scripts mis entre code et /code

    J'ai fait ceci:

    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
    31
    32
    33
     
    function BBCode($var)
    {
       //Code
       $bbcode[8]['Search'] = "!\[code\](.+)\[/code\]!isU";  
       $bbcode[8]['Replace'] = "$1";
     
       foreach($bbcode as $bbcode_str)
       {
          if($bbcode_str['Search']=="!\[code\](.+)\[/code\]!isU")
           {
           $debtablo="<table style=\"color:blue\" width=\"90%\" cellspacing=\"0\" cellpadding=\"0\" border=\"1\" align=\"center\" class=\"stile\">
           <tr><td class=\"stile\"><font color=black><b>Code:</font></b></td></tr>
           <tr><td class=\"quote\" class=\"stile\"><font size=2>";
     $milieu=$bbcode_str['Replace'];
     
    //changement ici
    $milieu=Colorise($milieu);
     
     
      $fintablo="</font></td></tr></table>"; 
           $total=$debtablo.$milieu.$fintablo;
     
          $var = preg_replace($bbcode_str['Search'],$total,$var);
           }
           else
           {
     
            $var = preg_replace($bbcode_str['Search'],$bbcode_str['Replace'],$var);
           }
       }
       return $var;
    }
    j'ai rajouté ceci :$milieu=Colorise($milieu);

    mais ceci ne marche pas , cela m'affiche :

    Code:
    1. [FONT=Arial, Helvetica, sans-serif]$1 [/FONT]



    que modifier pour que cela marche?

    merci d'avance

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Je crois que tu te compliques la vie :/
    D'où vient $1 ?
    Pour utiliser les rappels dans preg_replace, il faut utiliser \\1 et non $1.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
     
    $string = '1[cod]2[/cod]3';
    echo $string = preg_replace('#\[code\](.*)\[/code\]#si', "<font color=\"violet\">\\1</font>", $string);
     
    ?>
    Note : j'ai appelé la balise "cod" dans mon exemple pour éviter de faire bugger l'affichage dans ce forum... Appelle-la comme tu veux.

  3. #3
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    Citation Envoyé par Yogui
    D'où vient $1 ?
    Pour utiliser les rappels dans preg_replace, il faut utiliser \\1 et non $1.
    Oui, moi aussi ca m'a surpris, c'est une nouveauté PHP >= 4.0.4 en fait ;o)
    http://fr3.php.net/fr/preg_replace
    c'est totalement equivalent a \\1

    Sinon pour le probleme de bbcode... je suis en train d'en faire un aussi et c'est pas si evident, notemment pour les balises pouvant etre imbriquées comme (quote) (/quote) puisqu'on peut avoir : (quote=auteur1)...(quote=auteur2)...(/quote)...(/quote) et que le preg_replace avec l'option U prendra la chaine "(quote=auteur1)...(quote=auteur2)...(/quote)".

    Je me suis finalement résolu a faire un parcours de toute la chaine en sautant de balise en balise et en gérant une liste de balise ouvertes (comme une machine a état)
    Pour optimiser la recherche de balises bbcode j'utilise un seul preg_match_all avec l'option PREG_OFFSET_CAPTURE qui permet de récuperer aussi la position de la chaine capturée. Puis une boucle qui saute de balise en balise grace aux offsets et qui remplace a la volée lorsqu'on rencontre une balise fermante. Le code n'est pas encore terminé (il manque la gestion des erreurs) mais si ca t'interesse, je devrais pourvoir le donner ici ou en mp

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Ah, merci pour l'info. C'est plus simple, pas de problème d'antislashes à échapper !

    Sinon, il s'agit ici d'une balise [code], donc il n'y a pas besoin d'imbriquer comme pour [quote]. En ce sens, j'ai viré le modificateur U afin d'être sûr que la regex matche la plus grande chaîne possible.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 155
    Par défaut
    merci de vos reponses,
    j'ai donc essayé une fonction toute simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function BBCode($var)
    { 
     $var = preg_replace('#\[code\](.*)\[/code\]#si', "<a href="file://1/" target="_blank">\\1</a>", $var);
        return $var;
    }
    mais je ne voi pas comment je peut faire pour appliquer ma fonction de coloration au \\1?

    merci d'avance

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function BBCode($var)
    { 
       return preg_replace('#\[code\](.*)\[/code\]#si', $detablo."\\1".$fintablo, $var);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Fonction extrayant du texte autour d'un BBcode
    Par Gwennin dans le forum Langage
    Réponses: 9
    Dernier message: 08/08/2008, 11h54
  2. [RegEx] preg_replace et fonction intégrée, BBCode
    Par yanice dans le forum Langage
    Réponses: 2
    Dernier message: 09/02/2008, 10h27
  3. Réponses: 10
    Dernier message: 06/07/2007, 02h54
  4. Réponses: 2
    Dernier message: 22/06/2007, 17h25
  5. [phpbb] Probléme fonction bbcode
    Par jdotti dans le forum Langage
    Réponses: 3
    Dernier message: 22/09/2006, 23h24

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