Parser des BBcode, cas un peu spécial - 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 : Parser des BBcode, cas un peu spécial (/showthread.php?tid=4737) |
Parser des BBcode, cas un peu spécial - php_addict - 13-04-2010 bonjour, j'ai un cas un peu particulier car je dois transformer du BBcode en html mais le soucis c'est que je dois pour ce faire interroger la base de donnée... j'ai un texte du genre: Citation :et maintenant [player]1235[/player] du sublime village nommé [village]1689[/village] bla bla bla le but du jeu etant de remplacer [player]1235[/player] par <a href="joueur.php?id=1235">Le nom du joueur ayant pour id 1235</a> et [village]1689[/village] par <a href="village.php?id=1689">Le nom du villageayant pour id 1689</a> j'ai deja parser du BBcode, mais là je ne vois pas comment faire etant donnée qu'il faut interroger la base de donnée pour connaitre les noms en fonction des id, et je voudrais eviter d'interroger la bdd pour chaque bbcode car le texte peut contenir jusqu'à 30 bbcodes... auriez vous une piste de reflexion à me conseiller svp? merci de m'avoir lu bonne journée ! RE: Parser des BBcode, cas un peu spécial - Sephi-Chan - 13-04-2010 Je pense qu'il pourrait être intéressant de créer un service Web (attention, ça peut faire peur mais c'est assez simple). L'idée est d'envoyer une requête à l'URL suivante (dans le cas d'un user) http://example.com/user.php?id=1235&as=text. Cette page doit afficher uniquement une chaîne de caractères (et vraiment rien d'autre) : le nom de ce joueur/village/etc qui porte l'ID indiqué. L'avantage de cette technique, c'est que c'est simple à mettre en cache : en effet, le cache doit expirer uniquement quand la ressource change. Pour gérer un cache côté serveur, il faut qu'au premier appel à cet URL, tu teste la présence d'un fichier "tmp/cache/users/1235.txt". S'il existe, tu en récupères le contenu ; s'il n'existe pas, tu vas chercher ton information en base de données et tu l'écris dans le fichier. Ensuite tu affiches le contenu du fichier. Si la ressource change de nom ou est supprimée, tu vires simplement le fichier de cache, il sera régénéré par la prochaine requête. Pour la réalisation du parser, l'idée est de détecter ces balises, récupérer l'identifiants, puis lancer une requête via cURL à l'URL indiquée. C'est très simple. Tu peux aussi faire ça en Ajax, si tu acceptes de ne créer les liens que pour les utilisateurs de Javascript (ou que tu n'as pas accès à cURL). Ça t'évite d'avoir à créer/modifier ton parser. Sephi-Chan RE: Parser des BBcode, cas un peu spécial - Allwise - 13-04-2010 Sinon tu fais un preg_match_all qui récupère tous les identifiants qui sont entre [player] et [/player], [village][/village] etc, tu fais une requête qui récupère les infos des joueurs et autres entités dont l'id est dans ces tableaux. Exemple en code : Code PHP :
J'aime bien la solution des webservices proposée par sephi-kun, car un webservice pourra t'être utile pour d'autres choses. Cependant, imaginons que tu aies 40 identifiants dans ton bbcode, tester la présence de tous ces fichiers et les ouvrir serait très probablement plus lourd que d'envoyer une seule requête SQL. RE: Parser des BBcode, cas un peu spécial - php_addict - 13-04-2010 whaou! unGRAND merci à vous deux...je crois que je vais y passer la journée dessus et merci pour le code ! excelente journée à vous 2 RE: Parser des BBcode, cas un peu spécial - Cartman34 - 13-04-2010 Faut pas oublier non plus que la fonction preg_replace() accepte des fonctions dans son second paramètre. cf. http://fr.php.net/manual/fr/function.preg-replace.php Exemple #4. Mais bien lire: http://fr.php.net/manual/fr/reference.pcre.pattern.modifiers.php Option e (PREG_REPLACE_EVAL) C'est une fonction très puissante, autant utilisé ses capacités. RE: Parser des BBcode, cas un peu spécial - php_addict - 13-04-2010 bon, ca marche, voici comment je m'y suis pris: j'ai un texte: Code : et maintenant [playerid]1235[/playerid] du sublime village nommé [villageid]1689[/villageid] bla bla bla j'extrait seulement les BBcodes: Code : $extrait='[playerid]3[/playerid],[playerid]2[/playerid],[villageid]1[/villageid],[villageid]2[/villageid]' explosion de l'extrait en tableau: Code : $extrait=Array( [0] => [playerid]3[/playerid] recuperation des id player et village Code : $tableau_player=Array ( [[playerid]3[/playerid]] => 3 on interroge la base de donnée et on créé le tableau parseur $parseur_player Code : $tableau_player =Array ( [[playerid]3[/playerid]] => Array ( [pseudo] => Bob on remplace [playerid]2[/playerid] par <a href="joueur.php?id=2">Arthur</a> voili voilou...cela vous parait t il coherent? , ca me parait un peu lourdingue quand meme...meme si mon objectif est atteint: n'interroger que 2 fois la base de donnée encore merci à vous 3 RE: Parser des BBcode, cas un peu spécial - Allwise - 13-04-2010 Tu donnes le résultat de tes variables mais pas le code que tu utilises pour y arriver, difficile de donner un avis dans ces conditions, mais si tu as atteint ton objectif c'est déjà pas mal RE: Parser des BBcode, cas un peu spécial - My Hotel - 14-04-2010 Pour faire tout ça en une fois, tu aurais pu utiliser preg_replace, avec l'option e(regarde le message de IGstaff). Le principe est simple, à chaque occurence, tu remplace par une fonction qui est exécutée (grâce à l'option) et qui renvoie (en utilisant la BDD, le service web de Sephi, etc...) le remplacement. Parce que là tu te fais un peu ch*** pour rien, je pense Bye RE: Parser des BBcode, cas un peu spécial - Allwise - 14-04-2010 En utilisant une fonction de callback - d'ailleurs il existe aussi la fonction preg_replace_callback qui exécute une fonction sur une chaine et dont le nom est plus explicite - qui tape sur chaque occurrence trouvée est peut-être moins long en terme de quantité de code, mais sera plus lourd à l'exécution si celle-ci doit requêter la BDD à chaque fois. S'il y a une couche de cache c'est bien, mais comme je le disais plus haut le cache c'est bien pour les traitements lourds. Pour les petites requêtes il peut être plus avantageux d'interroger la base de données une fois que de tester la présence de xx fichiers et de les ouvrir. L'idée est, je pense, de privilégier la performance d'un script plutôt que son nombre de lignes. RE: Parser des BBcode, cas un peu spécial - php_addict - 14-04-2010 (14-04-2010, 07:59 AM)My Hotel a écrit : Pour faire tout ça en une fois, tu aurais pu utiliser preg_replace, avec l'option e(regarde le message de IGstaff). j'ai tenté de chercher des explication sur l'eval mais sans succes et je n'ai pas saisi comment l'utiliser...:$ |