GAGA Template

XLetter

BBcode

Vous devez être inscrit et connecté pour pouvoir écrire dans les forums

Page : 1
vistuo Posté le 20/08/2007 15:15 - #


Membre
22 messages
16 ans
Bonjour, a tous,
Voila j'ai un petit (dans ma plantation) !
Je suis sur la réalisation d'un forum (Ici)
Bien sur il est en Vbeta. Mais je voudrais ajouté du bbcode(modifié à ma version), j'ai fait mon code c'est ok, mais voila dès que je veux incrémenter plusieurs mêmes balises, ça bloque, alors voila je me suis dit que comme sur ce forum l'incrémentation de balises(par ex citation) fonctionne, peut-être gaga voudrait bien m'expliquer comment il fait fonctionner cela !

Exemple :
Citation : "Vistuo"
Citation Partie 1
Citation : "Vistuo"
Citation Partie 1.1


Je ne pense pas que mon code php soit interressant car il marche qu'a moitié ! , et est basé sur le cours du SDZ (bbcode)

Voila !
Merci beaucoup encore gaga (et Ze thriller pour la v3.3)

gaga26 Posté le 20/08/2007 18:21 - #



741 messages
18 ans
Salut,

Moi aussi j'ai galéré sur ce truc. Mais en m'inspirant du zcode présent dans le ZAP (un script de bluestorm), j'ai réussi.

Le truc c'est de rechercher toutes les citations qui n'ont pas de citation à l'intérieur d'elle même. Mais dans ce cas, seul la citation "au centre" serait parsée, c'est pourquoi, il faut faire une boucle:

        for($i = 0; ($i < 10) && (strpos($str, '<!</ citation>!>') !== FALSE); ++$i)
                $str = preg_replace('`<!<(citation)\s*()?\s*>!>((?:.(?!<!< citation>!>))*)<!</ citation>!>`sU', '<span class="citation_auteur">Citation</span><div class="citation">\3</div>', $str);

(j'ai volontairement mis des espaces pour éviter les erreurs)

vistuo Posté le 20/08/2007 18:31 - #


Membre
22 messages
16 ans
SUPER !
merci beaucoup, mais pourquoi fais-tu une boucle for 10 fois
de faire un
while(avec ton strpos ...)
ne serait-il pas mieux

Autre petite question, avec quoi fais-tu ta coloration syntaxique !
Merci c'est trop bien !

Edité par vistuo le 20/08/2007 18:34

gaga26 Posté le 20/08/2007 19:22 - #



741 messages
18 ans
La boucle de 10, c'est pour fixer une limite.

Pour la coloration syntaxique, va voir du coté de GeSHi.

vistuo Posté le 20/08/2007 23:29 - #


Membre
22 messages
16 ans
Enfin !
J'ai fini mon code qui est fonctionnet et très pratique, il est à vous !
C'est une classe :
<?php
class vcode {
        public $tag_limit=array('\[','\]','[',']'); //Les 2premiers pour les regex les autres pour le vrai nom => pour les 2prem '[' devient '\[' car c'est un métacaractères
       
        //1 : Tag d'ouverture et de fermeture
        //2 : on met la regex de la valeur, si il ni a pas de valeur on met ''
        //3 : Fermeture de la balise
        //4 : Imbrication de balises de même nom à l'interieur
        //5 : Le html après le remplacement
        /////////////////////////////
        // Ex: array('gras','',true,false,'<strong>$1</strong>'),
        //[gras]string[/gras] -> <strong>string</strong>
        // Ex: array('quote','(="(.+)")?',true,true,'Citation : $2  $3'),       
        //[quote]string[/quote] -> Citation : <br ./> string
        //[quote="Robert"]string[/quote] -> Citation : Robert  string
        // Ex: array('ligne','',false,false,'<hr />'),   
        //[ligne] -> <hr />
        public $tags=array();
       
        public function config($file) {
                if(!file_exists($file)) return false;
                require_once($file);
                if(!empty($tag_limit)&&is_array($tag_limit)) $this->tag_limit=$tag_limit;
                if(!empty($tags)&&is_array($tags)) $this->tags=$tags;
                return true;
        }
       
        private function imbrique($reg,$tag) {
                $o=$tag[2].$tag[4];
                $c=$tag[2].'/'.$tag[4].$tag[3];
                while(strpos($this->str,$o)!==FALSE && strpos($this->str,$c)!==FALSE && strpos($this->str,$o)<strpos($this->str,$c) && strpos($this->str,$o)+strlen($o)<strpos($this->str,$c)) {
                        $ipr=substr($this->str,0, strpos($this->str,$o)).preg_replace('!'.$reg.'!isU', $tag[8], substr($this->str,strpos($this->str,$o)));
                        if(!empty($temp)&&$temp==$ipr) return true;
                        $this->str=$temp=$ipr;
                }
                return true;
        }
       
        public function parse() {
                foreach($this->tags as $tag) {
                        $reg=$this->tag_limit[0].$tag[0].$tag[1].$this->tag_limit[1];
                        if($tag[2]) $reg.='(.+)'.$this->tag_limit[0].'/'.$tag[0].$this->tag_limit[1];
                        if($tag[3]) $this->imbrique($reg,array_merge($this->tag_limit,$tag));
                        else $this->str=preg_replace('!'.$reg.'!isU',$tag[4],$this->str);
                }
                return $this->str;
        }
}
?>


Dans une page quelquonque pour parser en vcode, bbcode, zcode, c'est vous qui vous voyez.
<?php
require_once('vcode.php');
$vc=new vcode();
$vc->config('vcode.inc.php'); //Pour changer la config
echo $vc->parse('<gras >Message test</gras>'); //J'ai ajouter un espace a la balise pour ne pas avoir de remplacement sur le forum
?>


Puis pour changer la config, le fichier vcode.inc.php
<?php
$tag_limit=array('<','>','<','>');


$tags=array(
        array('gras','',true,false,"<span class=\"vcode_gras\">$1</span>\n"),
        array('citation','(="(.+)")?',true,true,"<div class=\"vcode_bloc\">\n<div class=\"vcode_citation_auteur\">Citation : $2</div>\n<div class=\"vcode_citation\">\n$3\n</div>\n</div>"),
        array('ligne','',false,false,'<hr />')
);
?>


Voila ça marche du feu de dieu et en plus on peut mettre une infinité d'imbrication de balises et pas seulement 10 (pas vrai gaga26) !

Allez a+

Edité par vistuo le 20/08/2007 23:32

Ze Thriller Posté le 21/08/2007 16:52 - #


Membre
105 messages
24 ans
vistuo < ton BBCode adapté corrige les erreurs utilisateur automatiquement ?
Je veux dire par là que ton code est capable de traiter des choses comme:

[b][i]Kikoo ![/b][/i]

et de le transformer en :
[b][i]Kikoo ![/i][/b]


Si c'est le cas,ça m'intéresse

vistuo Posté le 24/08/2007 12:31 - #


Membre
22 messages
16 ans
Non désolé, mais j'y travaille !
Merci de m'avoir donné un boulot d'été !

Page : 1

Vous devez être inscrit et connecté pour pouvoir écrire dans les forums

Retour au forum Autre, à la liste des forums, ou au haut de page