JeuWeb - Crée ton jeu par navigateur
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)

Pages : 1 2 3


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 :
<?php
// Expression régulière
// Elle ne récupère que les nombres. si on a [player]' AND 1=1[/player] ça ne marchera pas.
// Pas la peine donc de caster les identifiants par la suite.
// Elle crée 2 groupes : la balise ouvrante et l'id
$reg = "#\[(player|village)\](\d+)\[/(?:player|village)\]#isU";

// La chaine qui contient ton bbcode
$str = "et maintenant [player]1235[/player] du sublime village nommé [village]1689[/village] bla bla bla
et maintenant [player]1635[/player] du sublime village nommé [village]1581[/village] bla bla bla"
;

// La requête pour les joueurs
$queryPlayers = "SELECT * FROM players WHERE player_id IN (%s)";

// On définit les tableaux qu'on va utiliser
$results = array();
$lstPlayers = array();
$lstVillages = array();

// Récupération des identifiants
preg_match_all($reg, $str, $results, PREG_SET_ORDER);

// On trie les résultats
foreach ($results as $r) {
if (
$r[1] == 'player')
$lstPlayers[$r[2]] = $r[2]; // Utiliser l'identifiant comme clé permet d'éviter les doublons.
elseif ($r[1] == 'village')
$lstVillages[$r[2]] = $r[2];

}
// Création de la requête finale des joueurs
$queryPlayers = sprintf($queryPlayers, implode(',', $lstPlayers));

?>

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 Wink

et merci pour le code !

excelente journée à vous 2 Wink


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]
                 [1] => [playerid]2[/playerid]
                 [2] => [villageid]1[/villageid]
                 [3] => [villageid]2[/villageid]
                 [4] => [villageid]1[/villageid]
                  )

recuperation des id player et village
Code :
$tableau_player=Array ( [[playerid]3[/playerid]] => 3
                             [[playerid]2[/playerid]] => 2
                           )

$liste_player = 3,2

$tableau_village=Array ( [[villageid]1[/villageid]] => 1
                               [[villageid]2[/villageid]] => 2
                             )
$liste_village = 1,2

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
                                                                  [id]     => 3
                                                                )
                             [[playerid]2[/playerid]] => Array  ( [pseudo] => Arthur
                                                                   [id] => 2
                                                                )

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 Wink


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 Wink


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 Wink

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).
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 Wink

Bye

j'ai tenté de chercher des explication sur l'eval mais sans succes et je n'ai pas saisi comment l'utiliser...:$