13-04-2010, 10:34 AM
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 :
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.