While vs str_replace [PHP] - PHP - Programmation
Marsh Posté le 09-06-2002 à 00:26:00
tu sais qu'avec preg_replace tu peux passer directement les array en argument ?
Marsh Posté le 09-06-2002 à 01:11:33
je sais pas m en servir...
mais si tu as un petit exemple
Marsh Posté le 09-06-2002 à 01:44:47
[php]
$smaa= array("",":cry:","","",":D"
,":hello:",":jap:",":love:",":bio:",":fuc
k:"
,":fou:",":f:",":lol:",":ouch:",":zzz:"
,":pouceup:",":poucedown:","" );
$smbb= array("oui","cry","clin","non","D
","salut","merci","love","biosuz","doigt
"
,"fou","joint","lol","ouch","z","pup"
,"pdo","pdi" );
$nbr_sm=18;
$nbr_vers_sm=0;
$message=preg_replace("/$smaa/","<img border=0 src=s/$smbb.gif>",$message);
[/php]
je pense que ca doit marcher ca
Marsh Posté le 09-06-2002 à 01:55:38
pour les smileys le str_replace est plus rapide je pense
par contre qd tu as une balise de début et de fin (bbcodes) le preg_replace est mieux
Marsh Posté le 09-06-2002 à 01:57:09
ethernal a écrit a écrit : pour les smileys le str_replace est plus rapide je pense par contre qd tu as une balise de début et de fin (bbcodes) le preg_replace est mieux |
oui mais bon vu qu'il fait une boucle while et qu'il a déjà son array, j'ai fait au plus rapide.
Marsh Posté le 09-06-2002 à 01:58:30
je m'en doutais
(en fait j-'-r espérait comme nous tous un copier-coller de ton oeuvre )
Marsh Posté le 10-06-2002 à 19:33:15
joce a écrit a écrit : [php] $smaa= array("",":cry:","","",":D" ,":hello:",":jap:",":love:",":bio:",":fuc k:" ,":fou:",":f:",":lol:",":ouch:",":zzz:" ,":pouceup:",":poucedown:","" ); $smbb= array("oui","cry","clin","non","D ","salut","merci","love","biosuz","doigt " ,"fou","joint","lol","ouch","z","pup" ,"pdo","pdi" ); $nbr_sm=18; $nbr_vers_sm=0; $message=preg_replace("/$smaa/","<img border=0 src=s/$smbb.gif>",$message); [/php] je pense que ca doit marcher ca |
J'ai essayé et ca veut pas fonctionner. La syntaxe est bonne mais ca ressort tel qu'elle sans modif...
Marsh Posté le 10-06-2002 à 20:40:51
et ca :
$smaa= array(":)",":cry:",";)",":(",":D" |
Marsh Posté le 10-06-2002 à 20:51:41
pareil
Code :
|
Marsh Posté le 10-06-2002 à 23:05:19
bcp plus rapide :
Code :
|
[test]
Citation : |
Citation :
|
Code :
|
[/test]
Marsh Posté le 10-06-2002 à 23:06:04
ethernal a écrit a écrit : bcp plus rapide :
|
yep
Marsh Posté le 10-06-2002 à 23:11:46
Joce, ça foire pas mal qd on insère des bbcodes dans le [ code ] [ /code ]
tu pourrais remplacer les [ et ] par 091; 093; dans les balises [code ] après avoir transformé le gras, souligné, couleur, comme ça plus de problème
(enfin, moi c ce que j'ai fait...)
Marsh Posté le 13-06-2002 à 20:05:53
Code :
|
Marsh Posté le 13-06-2002 à 20:32:30
voila qui me parait parfait !
Marsh Posté le 14-06-2002 à 21:38:31
$smaa= array(":)",":cry:",";)",":(",":D" |
Est-ce que quelqu'un pourrait m'aider à faire une extension à ce programme ?
J'aimerais que les tableaux ($smaa etc) soient initialisés à partir d'une table mysql et que la boucle qui remplace les caractères devienne une fonction ...
Je bute sur ceci :
1) J'ai lu sur un autre topic que mes variables de tableau n'étant pas déclarées dans la fonction, celle-ci n'y a pas accès --> problème ! Il faudrait en effet que je puisse initialiser les tableaux une seule fois au début, et ensuite pouvoir appeler autant de fois que je désire les fonctions pour remplacer ! Sinon, je dois initialiser les tableaux dans la fonction, ce qui ferait beaucoup de boulot pour rien ! Et peut-être de gros temps de chargement quand on appelle souvent les fonctions (comme dans le cas d'un forum ...).
2) Je ne sais pas déclarer un tableau vide ! Je suis obligé de mettre une première valeur, ce qui fausse les remplacements (enfin, on dirait !)
Quelqu'un pourrait-il m'aider ?
Merci d'avance !
Marsh Posté le 15-06-2002 à 02:10:00
Code :
|
Si tu veux tu peux déclarer $smileys en global pour ne pas devoir le passer à la fonction addSmileys.
Code :
|
Marsh Posté le 15-06-2002 à 02:25:35
à votre avis qu'est-ce qui est le plus intéressant ?
On prend un message de la bd, on recherche les smileys les uns à la suite des autres et on les remplace si nécessaire. Puis on passe au message suivant et ainsi de suite.
ou
l'avantage de la seconde proposition est que l'on ne parcourt qu'une fois le texte à la recherche d'un smiley disponible(proposé). Un même smiley présent dans plusieurs messages différents sera remplacé en 1 passage.
Inconvénient, on le fait sur un grand texte et il faut éventuellement exploder après.
Marsh Posté le 15-06-2002 à 10:33:52
pas trop mal l idée, mais il y a des risque de perte de mise en forme avec la deusieme methode,
mais je vais essayer, car mon temps de calcul est trop long...
Marsh Posté le 15-06-2002 à 11:17:29
Ethernal, merci pour le programme !
Je vais essayer ça tout de suite !
Marsh Posté le 15-06-2002 à 13:32:36
yannick_frere> de rien
j-'-r> qu'entends tu par avoir des pertes de mise en forme ?
ex
- tu décides que le caractère de séparation sera le {.
- tu transformes dons dans chaque message le { en code html (si jamais l'utiisateur le met dans son message...)
- tu concatènes le message au texte des messages
- tu remplaces dans ce texte les smileys, bbcodes, ... (évidemment il n'y a pas de limitation possible du nombre de smileys dans ce cas...)
- tu explodes le texte en message
- tu affiches chaque sujet, message, ....
Marsh Posté le 15-06-2002 à 18:09:06
Argh !!!
Y a une parse error à cette ligne-ci :
while ( $list($code, $img)= each($iSmileys) )
Dans phpEdit, y a une infobulle qui dit ceci, concernant cette ligne : array each(array array) ...
A noter que ça ne s'exécute pas non plus sur Multimania, à cause de la même ligne !
Zut ! Que puis-je faire ?? Tu vois où se situe le problème, Ethernal ?
Marsh Posté le 15-06-2002 à 18:11:31
while ( $list($code, $img)= each($iSmileys) )
while ( list($code, $img)= each($iSmileys) )
Marsh Posté le 15-06-2002 à 18:13:43
Aaah merci ^^
J'essaie ça !
C'est sympa de m'aider !
Marsh Posté le 15-06-2002 à 18:31:52
Y a quand même un truc qui marche pas, et que je ne comprend pas !
Il y a la ligne
global $id_cx ; |
($id_cx remplace ton $connexion)
Donc, ça veut simplement dire qu'$id_cx peut être utilisé dans d'autres scripts que celui dans lequel il a été créé, c'est bien ça ?
Mais pourquoi est-ce qu'on place le "global" ici ? Est-ce qu'on ne devrait pas le placer au moment où $id_cx est créé, c'est-à-dire dans mon petit package de connexion à la bd que j'inclu juste avant ton programme ?
En tout cas, mon problème est celui-ci : j'ai mis
$res= mysql_query( "select code, to from replace", $id_cx ) or die(1); |
et j'ai "1" quand j'exécute le fichier (enfin, quand j'exécute le fichier suivant :
<?php |
Pas doué hein ? ;o)
Marsh Posté le 15-06-2002 à 18:56:24
ta query est pas bonne
$res= mysql_query( "select code, image to from replace", $id_cx ) or die(1);
tu ne peux pas avoir de virgule directement avant un "from".
pour le global, ça veut dire que tu utilises une variable qui a été déclarée dans le programme principal et que tu peux la modifier directement.
maintenant, je n'ai pas encore testé
Code :
|
mais je suppose que ça devrait écrire 'test'...
Marsh Posté le 15-06-2002 à 22:20:05
Arf, ça marche toujours po snif ...
J'ai fait ceci :
$res= mysql_query( "SELECT code,image FROM replace",$id_cx ) or die(1); |
et ça n'a rien changé ...
Donc, comme je suppose qu'il y a une arnaque avec la variable $id_cx, j'ai fait ceci :
<?php |
et voici ce que j'obtiens :
Parse error: parse error, expecting `','' or `';'' in text_maker.php on line 5 |
Text_maker.php, c'est le programme ci-dessus. La ligne 5 étant "global $smileys ;"
Bref, les fonctions et moi, c'est vraiment pas la gloire ...
Marsh Posté le 16-06-2002 à 11:52:31
<?php |
Marsh Posté le 16-06-2002 à 13:18:02
L'épisode du jour ...
Bon, apparemment, le coup du point-virgule a débloqué un peu le machin, mais j'ai toujours que "1" qui s'affiche ... Autrement dit, la requète foire ...
Je pige vraiment plus rien ! Pourtant j'inclus bien les bons fichiers ! Pis j'ai déjà fait ce genre de truc plein de fois (include un fichier qui crée la connexion à la BD, pis faire des requètes utilisant $id_cx) ... mais là, que dalle !
Il n'y aurait pas moyen de demander à Mysql de fournir plus d'infos sur ce qui ne va pas ?
Et est-ce que certains d'entre vous utilisent des éditeurs de php ? Parce que je tape mon code sous Dreamweaver, là ... Peut-être qu'un éditeur de code avec un simulateur pourra en dire plus long sur ce qui ne va pas ... ?
Marsh Posté le 16-06-2002 à 13:20:21
vérifie le nom des champ et de ta table.
teste ta query sous mysql en ligne de commande ou sur phpMyAdmin
Marsh Posté le 16-06-2002 à 15:30:48
Honnêtement, il faut pas croire, mais je suis vraiment gêné de te faire perdre ton temps comme ça, Ethernal !
J'ai testé ma requête sur phpmyadmin (riche idée d'ailleurs) avec le nom de table "replace" et elle n'a pas fonctionné. J'ai donc changé la table pour "smileys" car je me suis dit que peut-être le mot "replace" était un mot réservé de Mysql. Ca marchait sur phpmyadmin (j'ai essayé plusieurs fois, au cazou) mais j'ai toujours "1" quand j'exécute mes fichiers sur le server ... Ce n'était donc pas cela, ou du moins pas "que" cela ...
Donc, allons-y pour les détails ! Si ça se fait, c'est une grosse bétise que j'oublie, et je sens que je vais m'en vouloir, mais bon ...
Mon répertoire s'architecture comme ceci : dans la racine, j'ai le fichier index.php, puis les répertoires "modules" et "tests". "Modules" contient le fichier "text_maker.php" qui est le programme que tu m'as filé ainsi que les fichiers qui permettent de se connecter à ma base de donnée et de la fermer. J'utilise ces fichiers pour toutes mes pages et ils ont l'air de fonctionner parfaitement ... Ensuite, "tests" contient le fichier "string.php" qui est le fichier que j'exécute pour essayer de faire remplacer un smiley dans une chaine ...
Voici le contenu du fichier string :
<html> |
Et le contenu du fichier "text_maker.php" :
<?php |
Donc voila ! Je me demande bien où je fais l'erreur !
A noter que je viens juste de faire une ch'tite expérience : remplacer les "include (etc)" dans "string.php" par le contenu des fichiers concernés ... ben là ça marche ! Enfin non : ma chaine contient toujours "" mais au moins j'ai plus le "1" du "die" de la requête ... bref, ça progresse ...
Je préfère ne pas tirer de conclusion sur cette expérience ...
Ce qui est certain, c'est que ça me fait vraiment ch*** ! Le bon côté des choses, c'est que je ne ferai plus jamais cette erreur, si on la trouve ... Je sais, c'est maigre comme consolation pour le pauvre Ethernal ! En tout cas, merci beaucoup pour ton aide !
Marsh Posté le 16-06-2002 à 15:34:07
Attention, je voulais dire ceci :
Enfin non : ma chaine contient toujours ":)"
Le forum a remplacé ":)" par le smiley, mais c'est bien le code texte que je vois, pas le dessin ...
J'avais oublié de décocher la case "désactiver les smilies" ...
Voila ..
Marsh Posté le 16-06-2002 à 16:00:15
contenu du fichier string :
<html> |
contenu du fichier "text_maker.php" :
<?php |
que contient ../modules/db_connect.php ?
si ta connexion est créée dans une fonction tu dois aussi la déclarer en global.
Marsh Posté le 16-06-2002 à 17:00:22
J'ai ajouté le "global $smileys ;" dans la fonction et l'ai retiré du code au-dessus comme tu me l'as indiqué, mais ça ne marche toujours pas ...
D'ailleurs, ça m'aurait étonné car je suppose que le server ne passe même pas par cette ligne, vu qu'il s'arrête à la requête (via le die) ...
J'ai également fait les modifications dans le fichier qui est la fusion des 3 (sans "include" donc) et le résultat est le même : la requête passe, la phrase s'affiche, mais le smiley n'y est pas. Disons que j'ai pas réglé correctement les noms d'images dans la base de donnée, mais je considère que si le remplacement a lieu, il y aura la balise img etc et donc même si je n'ai pas d'image, j'aurai le cadre d'image avec une erreur ... donc, le problème ne vient pas de là ... Pis je vérifie la source du fichier donc, je le verrais si ça marchait ...
Contenu du fichier db_connect.php (je masque quand même les infos privées hein ;o) :
<?php |
Allez, tant que j'y suis, je met également le contenu du fichier fusionné :
<html> |
Tiens, c'est bizarre ... (ceci est une réflexion en direct ...). Dans la fonction addsmileys, tu retournes $iString alors que tu travailles sur $message ... J'me demande si ça n'irait pas mieux en retournant $message ... J'vais voir ça ...
Bon, j'ai essayé ceci :
function addSmileys($iString) |
Mais ça ne marche pas non plus ... Je commence à me demander si Multimania ne serait pas en panne, vu que c'est assez régulier (même si mes autres pages fonctionnent ...)
Bon ben je crois qu'avec ça, tu as toutes les données !
Si jamais tu en avais marre ou bien si tu cales, ce n'est pas grave hein ! Je travaillerai sur quelque chose d'autre en attendant d'avoir de meilleures connaissances ... Ca m'énerve de n'avoir jamais réussi à faire une fonction (je réalise maintenant que c'est peut-être bien à cause du problème que j'ai actuellement), m'enfin bon ... Je veux pas que tu perdes ton temps quoi !
Marsh Posté le 16-06-2002 à 18:04:07
dis moi , tu as le smiley ':)' dans ta base au moins ??
j'utilise jamais le 'or die()' dans mes progs, je ne sais pas exactement comment il fonctionne.
S'il se base sur le fait que si la fonction retourne false, il exécute le die(), un select vide retourne 0 qui peut être assimilé à false. ce qui peut engendrer des confusions...
pour être sur utilise plutôt
if (!$id_cx){
echo "pas de connexion BD";
exit;
}
$res= mysql_query("select...",$id_cx);
...
Marsh Posté le 16-06-2002 à 18:27:16
Salut !
Décidément, t'auras eu du mérite de m'aider ;o)
Alors, le code smiley se trouve bien dans la table ...
Le "or die", ça fonctionne comme ceci : si l'instruction qui précède le "or" échoue, alors le contenu de die() s'exécute ... Donc, je pense qu'un select vide ne changerait rien, car la requète aurait quand même eu lieu ... elle est vide, soit, mais elle a eu lieu ...
J'ai utilisé le if comme tu me l'as demandé et le résultat est immédiat : "Pas de connexion BD" ... Ca explique quand même bien des choses ...
Donc, l'expérience du fichier fusionné et celle-ci montre bien, je crois, qu'il y a un gros problème avec les include() : j'inclu le fichier "db_connect.php" qui crée correctement la connexion $id_cx (puisque la connexion marche dans le fichier fusionné) mais apparemment, $id_cx n'est pas accessible au reste du fichier, et donc, au moment de faire la requête ...
C'est d'ailleurs très étrange car tous mes autres fichiers utilisent cette méthode et ça marche très bien ... J'y comprend vraiment plus rien !
Mais j'aimerais quand même essayer d'avoir le fin mot, car j'ai plusieurs fichiers avec des fonctions comme ça que je n'ai jamais pu faire marcher alors que je pensais qu'ils étaient corrects ... Je suppose qu'il s'agit de la même erreur qu'actuellement ...
Marsh Posté le 17-06-2002 à 00:23:41
Diantre !
Si Ethernal me lache, j'suis fichu ;o)
Marsh Posté le 17-06-2002 à 10:34:09
ouaip désolé je suis à court d'idée là .
Marsh Posté le 17-06-2002 à 15:52:07
Ah ... bon ben tant pis ^^
Merci quand même pour tout le temps que tu as passé à m'expliquer !
J'ai vraiment apprécié !
Tiens ? T'es belge ? Quel dommage ce match contre le Brésil !
Bon, je m'attendais à la défaite, mais pas comme ça ...
Enfin soit, ça n'a pas grand chose à voir avec la programmation !
Bybye !
Marsh Posté le 09-06-2002 à 00:08:36
il est ou le pb ? ca marche pô...
---------------
Perdu ? Vous êtes ici : --> *