JeuWeb - Crée ton jeu par navigateur
Problème BBcode - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Problème BBcode (/showthread.php?tid=2342)

Pages : 1 2 3


RE: Problème BBcode - Zamentur - 06-02-2008

Citation :Maintenant au moins, je sais dans quelle direction m'orienter 71 , je dois tenter d'afficher le 'parse_code' indirectement
Tu "crois" savoir dans quel direction t'orienter...

Là tu as un vrai problème de compréhension du fonctionnement d'une fonction! C'est pas possible que çà marche de cette manière avec preg_replace.

#Pourquoi?
On reprend ton exemple:
Code PHP :
<?php 
$chaine
= preg_replace('/\[php\](.+?)\[\/php\]/', new GeSHi('$1','php'), $chaine);

preg_replace est une fonction, ce qui veut dire que c'est un genre de boite noire dans laquel on rentre des valeurs dans un format définit et qui nous ressort des valeurs dans un format définit.

Ainsi le second attribut de preg_replace attend quelques choses au format texte. new GeSHi('$1','php') représente un objet et donc ce n'est pas un texte. D'ou le message d'erreur
Citation :Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /mnt/140/sdb/1/8/0tt0k4r/BBcode.php on line 18

Maintenant effectivement la méthode parse_code() de GeSHi renvoie une chaine de caractère. Sauf que si on regarde l'ordre d'exécution on s'aperçoit que la coloration sera faite non pas sur ce qui se trouve entre les balises bbcode, mais sur la chaine de caractère '$1'

Donc même si tu réussissais à faire ce que tu dis "tenter d'afficher le 'parse_code' indirectement" Voici dans quel ordre serait faite les actions:
  1. création de l'objet GeSHi
  2. application de la méthode parse_code à la chaine de caractere passé en première argument soit '$1' (et non pas ce par quoi sera remplacé $1 ensuite...)
  3. application de la fonction preg_replace avec en 2eme paramètre la chaine de caractère retourné par la méthode parse_code donc Remplacement de $1 dans la chaine retourné par la méthode par ce qui est entre parenthèse dans la première expression.

La coloration est donc faite avant le remplacement, normal que ce soit pas coloré!

Il faut donc réussir à faire la coloration après(et non avant) le remplacement ce que au risque de me répéter preg_replace_callback permet. Car preg_replace_callback attend en second argument non plus une chaine de caractère mais le nom d'une fonction dans laquel il passeras en argument les chaines contenue dans les parenthèses de l'expression régulière.
preg_replace_callback remplace alors la partie de chaine de caractere qui valider l'expression rationelle par le résultat de cette fameuse fonction

Note:
Je t'ai présenté dans le poste précédent une solution qui je pense fonctionne (pas testé mais çà doit être bon). Faudrait au moins songer à regarder dans la direction qu'on te donne, et si tu ne comprend pas son intérêt demander pourquoi celle là plutôt qu'une autre! Si tu ignores ce qu'on te dis je vois pas l'intérêt de faire un poste de demande d'aide!

Rappel de la solution:
Code PHP :
<?php 
function parse($arg){
$convert=array('html'=>"html4strict",'php'=>'php');
$couleur =& new GeSHi($arg[2],$convert[$arg[1]]);
return
$couleur->parse_code();
}
$chaine="le texte avant[html]le texte dedans[/html]le texte après";
preg_replace_callback('/\[(html)\](.+?)\[\/html\]/', "parse", $chaine);