PHP et BBCODE

Résolu
Utilisateur anonyme - 30 juil. 2007 à 23:52
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 - 5 août 2007 à 13:13
Bonjour à tous,

Je cherche a créer un script pour mon forum, http://conteslegendes.free.frum (un pe de pub au passage).
Le but de ce script est de pouvoir afficher ou masquer des calques. Je m'explique :

Je voudrais que lorsque l'utilisateur insere la balise [spoil]/spoil, une fonction php remplace ces balises par le code html d'un calque div qui contient des arguments javascript qui permettent de l'afficher ou de le masquer.

Le probleme est que lorsque l'utilisateur insere deux fois la balise [spoil]/spoil et ben ca bug parce que la fonction javascript demande l'identifiant du calque qu'elle doit afficher et ces deux calques ont le meme identifiant.


Voici une parti de la fonction :

// spoiler
$num = rand();
$t = str_replace("[spoil]", "

ATTENTION : SPOILER - Cliquez ici pour voir ou cacher le contenu
", $t);
$t = str_replace("/spoil", "

", $t);

Voila. Donc en fait je voudrais savoir si il existe une fonction php qui compte le nombre de fois qu'apparait une occurence et qui les remplace une par une, ce qui me permettré de changer la variable $num a chaque fois.

Sinon, auriez vous une autre méthode ?

15 réponses

Utilisateur anonyme
1 août 2007 à 01:55
Donc, après plusieurs tentatives acharnées a essayer de comprendre pourquoi ca marchait pas, j'ai compris avec l'aide du manuel php que mes soucis venaient de foreach (parce qu'en fait foreach fait tout ce qu'il a a faire avec les colonnes du tableau et ensuite fait le reste)
ex :
$t[0] = 'Hello';
$t[1] = "Worlde";
$i = 0;

foreach ($t as $value){
echo $value;
echo $i;
$i++;
}
donnera :
HelloWorld0

donc, j'ai utilisé la solution du for($i=0; $i<count($t);$i++)

mais j'ai fait quelques bidouilles juste avant et ca me donne ceci :

$t = str_replace("[spoil]", "¤[spoil]", $t);
// remplacement des balises [spoil] par ¤[spoil]
$t = explode("¤",$t);
// découpage en segments a partir du caractere "¤" ce qui me permet de garder les balises [spoil] dans les segments
$i = count($t);
// savoir combien de cases contient le tableau $t qui est créé
$n=0;
while($n<$i){
$num = rand();
// Num recoit un nombre au hasard a chaque deroulement de la boucle
$t[$n] = str_replace("[spoil

...
",$t[$n]);
$n++;
}
for($n=0;$n<$i;$n++){
$v .= $t[$n];
}
// Re concatenation de la chaine de caractere
$t = str_replace("/spoil", "

", $v);
// Remplacement des balises /spoil par des balises fermantes



Voila c'est pas tres glorieux mais ca marche. Je te remercie d'avoir porté ton attention sur mon sujet et pour l'aide que tu m'as apportée.

Merci beaucoup
3
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
31 juil. 2007 à 10:56
Hello,

// spoiler

$t = explode('[spoil]', $t);

foreach($t as $value){
    $num = rand();
    $t = "

ATTENTION : SPOILER - Cliquez ici pour voir ou cacher le contenu
".$t;
    $t = str_replace("/spoil", "

", $t);
}

avec ça tu as un tableau, tu le concatènes et c'est bon.
Par contre tu m'as l'air d'avoir des pbs avec tes " et tes '... j'ai pas corrigé mais bon. Et mets tes css dans une feuille à part.
à+
0
Utilisateur anonyme
31 juil. 2007 à 13:33
J'avais pas du tout pensé à utiliser Foreach.

En tout cas je vais essayer et je te remercie pour ta réponse.
Pour les " et ' apparement je n'ai pas de pb.

Et, je ne peux pas mettre mes css ds une feuille a part parce que l'identifiant de chaque calque est généré dynamiquement. Je ne connais pas l'ID du calque a l'avance.
0
Utilisateur anonyme
31 juil. 2007 à 14:07
J'ai essayé, ca ne fonctionne pas vraiment. Le probleme est que tous les calques sont inclus les uns dans les autres. Je ne sais pas ourquoi.

http://conteslegendes.free.fr/forum/View_Sujet.php?Sujet=64
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
31 juil. 2007 à 14:32
Tu as dû oublier de fermer une div ou un truc comme ça.

Sinon, aucun rapport entre un id dynamique et une classe css, du moins dans ton cas. Ca n'empêche pas.

Et ton javascript ne marchera pas parce que tu échappes des ' alors que tu utilises de " pour php.

à+
0
Utilisateur anonyme
31 juil. 2007 à 14:37
ca y'est j'ai reglé le pb il manquait le str_replace('[spoil]',.....,$t);

mais c'est vrai que mon javascript ne fonctionne pas. Est ce que tu sais comment je peux arranger ca stp ?
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
31 juil. 2007 à 14:52
Je ne sais pas ce que tu as fait mais dans ma solution, il n'y avait pas à remettre de str_replace('[spoil]',.....,$t)...

pour le javascript comme je te l'ai dit, tu as mis /' au lieu de ' à plusieurs endroits. Je n'ai pas regardé s'il y avait d'autres erreurs.

à+
0
Utilisateur anonyme
31 juil. 2007 à 14:57
mais en fait j'ai besoin d'echapper les ' aussi car sinon, il y a une erreur au moment de l'insertion dans la table mysql.
Et je ne comprend pas parce que le javascript fonctionne kan il un spoil ds un message. Mais, il ne fonctionne pas quand il yen a plusieurs.
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
31 juil. 2007 à 15:15
Il faut échapper les requêtes sql avec addslashes juste avant de les passer, pas dans le javascript... fais-voir ton code maintenant si t'as encore un pb ? et sans les styles, ça me fatigue les yeux :)
0
Utilisateur anonyme
31 juil. 2007 à 15:25
bon en fait j'ai compris pourquoi ca march pa. c parce que j'ai rajouté str_replace ce qui fait que $num est tjr pareil
0
Utilisateur anonyme
31 juil. 2007 à 20:56
La faille dans le code que tu m'as donné c'est que tu ajoute le code du calque au début du texte qui est découpé. Le probleme, c'est que si l'utilisateur poste du texte normal avant un spoil, un calque sera inseré avant ce texte. Mais, il ne sera pas fermé donc les autres calques seront inclus dans celui ci.
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
31 juil. 2007 à 22:49
Encore bloqué là-dessus ??

Oui effectivement il ne faut pas le mettre au premier passage dans la boucle, je suis allé un peu vite, mais rien de dramatique :

// spoiler

$t = explode('[spoil]', $t);

$i = 0;
foreach($t as $value){
if($i != 0){
    $num = rand();
   
$t = "

ATTENTION : SPOILER - Cliquez ici
pour voir ou cacher le contenu
".$t;
    $t = str_replace("/spoil", "

", $t);
    }
$i++;
}

tu pourrais aussi faire un for(i=1 ; i<count($t); i++) ce serait pareil.

à+
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
1 août 2007 à 12:28
Bon et bien tant mieux, même si ton code me paraît bien compliqué pour ce qu'il fait.
Par contre comme je te l'ai dit dans mon message précédent, foreach+l'incrémentation et for($i=1 ; $i<count($t); $i++) ont exactement le même comportement sur un tableau avec des clés de 1 à n, donc le problème "ne vient pas" de foreach.
à+
0
Utilisateur anonyme
4 août 2007 à 20:13
Désolé pour cette réponse tardive mais je t'assure que foreach n'execute que des requetes cncernant les cellules de ton tableau.

Exemple testes ce morceau de code
$t[0] = 'Hello';
$t[1] = "World";
$i = 0;

foreach ($t as $value){
   echo $value;
   echo $i;
   $i++;
}

D'après ton point de vue, le résultat devrait être :
Hello0World1

et pourtant, je t'assure qu'il sera HelloWorld0.
0
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
5 août 2007 à 13:13
Salut !

J'ai copié-collé le bout de code que tu as mis : ça me donne bel et bien Hello0World1 !!!
Je ne sais pas comment tu fais pour arriver à d'autres résultats... tu peux réessayer pour voir ?
à+
0
Rejoignez-nous