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

  1. #1
    Membre régulier
    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
    Points : 88
    Points
    88
    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
    Points : 29 985
    Points
    29 985
    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 expérimenté

    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
    Points : 1 565
    Points
    1 565
    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
    Points : 29 985
    Points
    29 985
    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 régulier
    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
    Points : 88
    Points
    88
    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
    Points : 29 985
    Points
    29 985
    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);
    }

  7. #7
    Membre régulier
    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
    Points : 88
    Points
    88
    Par défaut
    non je parlais de ma fonction colorise() que je veut appliquer sur l'interieur des balise code

    quelqu'un aurait une idée?

  8. #8
    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
    Points : 29 985
    Points
    29 985
    Par défaut
    Flûte, faut tout te faire :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function BBCode($var)
    { 
       return preg_replace('#\[code\](.*)\[/code\]#si', $detablo.colorise("\\1").$fintablo, $var);
    }

  9. #9
    Membre régulier
    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
    Points : 88
    Points
    88
    Par défaut
    merci mais ceci ne marche pas je m'explique

    j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $var = preg_replace('#\[code\](.*)\[/code\]#si', Colorise("<a href="file://1/" target="_blank">\\1</a>"), $var);
    et cela maffiche (\1 )

    voici ma fonction colorise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function Colorise($code)
    {
    include_once('fichiers/geshi.php');
    $language = "php";
    $geshi =& new GeSHi($code, $language);
    $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS);
    $geshi->set_line_style('font-size:12px;font-family:Arial, Helvetica, sans-serif'); 
    $geshi->set_code_style('font-size:12px;font-family:Arial, Helvetica, sans-serif'); 
    $geshi->set_header_type(GESHI_HEADER_DIV);
    $geshi->set_tab_width("90%"); 
    $code= $geshi->parse_code(); 
    return $code;
    }
    j'utilise geshi pr coloriser mon code, mais a priori pas moyen de passer linterieur des balises

    Quelqu'un voit il comment faire?

    merci

  10. #10
    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
    Points : 29 985
    Points
    29 985
    Par défaut
    Perso, ça me ferait bizarre d'appeler include() à l'intérieur d'une fonction. Il vaut mieux l'appeler avant.

    Sinon, es-tu certain que ta fonction Colorise() retourne bien le code que tu souhaites ? Pour t'en assurer, appelle-la en-dehors du preg_match().

    [Edit] Ouais, laisse tomber ce que je dis...
    Exemple qui fonctionne, essaie de méditer dessus un moment :
    <?php

    function Colorise($string){
    &#160;&#160;&#160;&#160;&#160;&#160;return
    '<font color="red">'.$string.'</font>';
    }

    $var = '1&#91;code]2&#91;/code]3';

    echo
    preg_replace('#\&#91;code\](.*)\&#91;/code\]#si', Colorise("\\1"), $var);

    ?>
    Colorez votre code PHP sur les forums grâce à Developpez.com

  11. #11
    Membre régulier
    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
    Points : 88
    Points
    88
    Par défaut
    oui elle marche je l'ai fait directement ailleur, pour le include c'est temporaire, le problème c'est qu'il prend "\\1" comme une chaine donc il colorise que ceci, normal ! cela vient du passage du parametre mais comment détourné ceci?

  12. #12
    Membre régulier
    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
    Points : 88
    Points
    88
    Par défaut
    ok dac je comprends ça vien de geshi, je cherche sur la doc mais galère:

    http://qbnz.com/highlighter/geshi-doc.html

  13. #13
    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
    Points : 29 985
    Points
    29 985
    Par défaut
    Hum, non, on dirait que ton paramètre est mal passé à la fonction. Ta classe d'affichage n'a rien à voir, tout se passe bel et bien dans le preg_match() pour le moment.
    Fais des tests avec ce que je t'ai proposé, compare avec ce que tu as fait.

  14. #14
    Membre régulier
    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
    Points : 88
    Points
    88
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $var =  preg_replace("#\[code\](.*?)\[/code\]#sie", "Color('$1')", $var);
    voila la solution grace au forum du site officiel :d

    merci de tes réponses, ça ma pas mal avancé quand meme

+ 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, 12h54
  2. [RegEx] preg_replace et fonction intégrée, BBCode
    Par yanice dans le forum Langage
    Réponses: 2
    Dernier message: 09/02/2008, 11h27
  3. Réponses: 10
    Dernier message: 06/07/2007, 03h54
  4. Réponses: 2
    Dernier message: 22/06/2007, 18h25
  5. [phpbb] Probléme fonction bbcode
    Par jdotti dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2006, 00h24

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