Problème avec preg_replace ...

Problème avec preg_replace ... - PHP - Programmation

Marsh Posté le 16-12-2005 à 19:02:51    

Salut à tous,
 
Je suis en train de programmer un forum et je suis en train de faire la fonction qui remplace les mots censurés.
 
Voilà ce que j'ai fait pour le moment (avec con comme exemple) :
 

Code :
  1. preg_replace("@[^a-zA-Z0-9]{1}(con){1}[^a-zA-Z0-9]{1}@i","c**",$message)


 
Donc, en gros, je teste si le mot est dans la chaine et s'il est entouré par des caractères non alphanumériques (pour éviter de remplacer "con" dans "connecter" par exemple).
Seulement, dans l'exemple, je voudrais juste remplacer con et non les caractères qui l'entourent : est-ce faisable en modifiant mon expression rationnelle ?
(je précise que je débute tout juste avec les exreg :/)
 
Merci d'avance :jap:

Reply

Marsh Posté le 16-12-2005 à 19:02:51   

Reply

Marsh Posté le 16-12-2005 à 19:33:02    

tu captures les caractères non alphanumérique pour les remettre dans ta chaine
par exemple :

Code :
  1. preg_replace("@(\W{1})(con)(\W{1})@i",'\1c**\3',$message);

Reply

Marsh Posté le 16-12-2005 à 19:34:40    

ok, merci :jap:
 
Juste une précision : \W veut dire non alpha numérique ?

Reply

Marsh Posté le 16-12-2005 à 19:36:11    

http://fr2.php.net/manual/fr/refer [...] syntax.php

Citation :

\W
    tout caractère qui n'est pas un caractère de "mot"


Reply

Marsh Posté le 16-12-2005 à 19:59:39    

Merci beaucoup pour le lien, j'arrivais pas à trouver :jap:

Reply

Marsh Posté le 29-12-2005 à 14:23:40    

J'ai de nouveau un petit problème : voici mon code, pourriez-vous me dire ce qui ne va pas SVP ?
 

Code :
  1. $txt = preg_replace("@([ code]){1}(.*)([/code]){1}@i","<table align='center' width='95%'><tr><td><b>Code :</b></td></tr><tr><td class='quote'><pre>$2</pre></td></tr></table>",$txt);


 
A mon avis, je ne suis pas loin, mais qu'est-ce qui ne va pas ?


Message édité par nero27 le 29-12-2005 à 14:24:22
Reply

Marsh Posté le 29-12-2005 à 14:38:18    

on va avoir du mal a dire ce qui ne va pas si tu ne nous dis pas ce qui ne va pas.
Bon on va admettre que ça fait pas le replace!
 
2 choses:
1- ta regex est pas super ou alors je comprends pas ce que tu veux! si le motif que tu cherches c'est

Code :
  1. [ code]blalbla bvalbal blall[/code]


Ta regex devrait être:

Code :
  1. @\[code\](.*?)\[/code\]@


2- le code html de ton replace est pas beau :o

Reply

Marsh Posté le 29-12-2005 à 15:03:59    

ok, merci, c'est bien ce que je voulais, voilà ce que ça donne :

Code :
  1. $txt = preg_replace("@(\[ code\])([\s\S]*?)(\[/code\])@i","<table align='center' width='95%'><tr><td><b>Code :</b></td></tr><tr><td class='quote'><pre>$2</pre></td></tr></table>",$txt);


 
Sinon, j'ai un preg_replace pour remplacer les balises [img], mais je voudrais qu'il ne fonctionne que si celles-ci ne sont pas entre des balises [ code] : c'est possible ?
 
Voici la fonction actuelle :

Code :
  1. $txt = preg_replace("@(\[img\])([\s\S]*?)(\[/img\])@i","<img src='$2'>",$txt,10);


 
Y'a-t-il un moyen de dire dans la regexp qu'il ne faut pas que la chaine est une balise [ code] sans balise [/code] qui suit pour remplacer la balise [img] ?

Message cité 1 fois
Message édité par nero27 le 29-12-2005 à 15:10:45
Reply

Marsh Posté le 30-12-2005 à 11:03:10    

Si quelqu'un a un court ou un tuto sur l'utilisation des regexp, je suis preneur :jap:
 
Parce que pour le moment, j'y vais un peu à tâtons :/


Message édité par nero27 le 30-12-2005 à 11:04:00
Reply

Marsh Posté le 30-12-2005 à 11:38:18    

Va fais un tour sur www.expreg.com :)
Sinon, utilise le \b pour les limites de mots
 
Par exemple \bcon(s)?\b


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 30-12-2005 à 11:38:18   

Reply

Marsh Posté le 30-12-2005 à 17:47:42    

nero27 a écrit :

ok, merci, c'est bien ce que je voulais, voilà ce que ça donne :

Code :
  1. $txt = preg_replace("@(\[ code\])([\s\S]*?)(\[/code\])@i","<table align='center' width='95%'><tr><td><b>Code :</b></td></tr><tr><td class='quote'><pre>$2</pre></td></tr></table>",$txt);




 
Au lieu de mettre [\s\S], utilise plutôt '.' et rajoute l'option s à ton masque pour qu'il matche sur les sauts de ligne. Inutile de catcher [ code] et [/code] non plus.
 

Citation :


Sinon, j'ai un preg_replace pour remplacer les balises [img], mais je voudrais qu'il ne fonctionne que si celles-ci ne sont pas entre des balises [ code] : c'est possible ?
 
Voici la fonction actuelle :

Code :
  1. $txt = preg_replace("@(\[img\])([\s\S]*?)(\[/img\])@i","<img src='$2'>",$txt,10);


 
Y'a-t-il un moyen de dire dans la regexp qu'il ne faut pas que la chaine est une balise [ code] sans balise [/code] qui suit pour remplacer la balise [img] ?


 

Code :
  1. $pattern = '#(^|\[/code\])(.*?)($|\[code\])#ise';
  2. $replacement = '"$1" . preg_replace("#\[img\](.*?)\[/img\]#is", "<img src=\"\$1\" />", "$2", 10) . "$3"';
  3. $txt = preg_replace($pattern, $replacement, $txt);


 
Un brin bourrin, mais je vois pas comment faire autrement.

Message cité 1 fois
Message édité par sielfried le 30-12-2005 à 17:48:53

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 30-12-2005 à 18:36:33    

sielfried a écrit :

Au lieu de mettre [\s\S], utilise plutôt '.' et rajoute l'option s à ton masque pour qu'il matche sur les sauts de ligne. Inutile de catcher [ code] et [/code] non plus.
 

Citation :


Sinon, j'ai un preg_replace pour remplacer les balises [img], mais je voudrais qu'il ne fonctionne que si celles-ci ne sont pas entre des balises [ code] : c'est possible ?
 
Voici la fonction actuelle :

Code :
  1. $txt = preg_replace("@(\[img\])([\s\S]*?)(\[/img\])@i","<img src='$2'>",$txt,10);


 
Y'a-t-il un moyen de dire dans la regexp qu'il ne faut pas que la chaine est une balise [ code] sans balise [/code] qui suit pour remplacer la balise [img] ?


 

Code :
  1. $pattern = '#(^|\[/code\])(.*?)($|\[code\])#ise';
  2. $replacement = '"$1" . preg_replace("#\[img\](.*?)\[/img\]#is", "<img src=\"\$1\" />", "$2", 10) . "$3"';
  3. $txt = preg_replace($pattern, $replacement, $txt);


 
Un brin bourrin, mais je vois pas comment faire autrement.


Que veux-tu dire par catcher ?
Sinon, merci pour le conseil avec "." et "s" ;)
 
Sinon, je vais regarder de plus près ta proposition, merci :jap:

Reply

Marsh Posté le 30-12-2005 à 19:35:35    

nero27 a écrit :

Que veux-tu dire par catcher ?


 
Mettre entre parenthèse dans le masque. Ca ne te sert à rien ici (tu ne te sers que de $2).


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 31-12-2005 à 14:01:53    

ok, merci pour le conseil ^^

Reply

Marsh Posté le 04-01-2006 à 12:16:09    

Merci, ta solution fonctionne, mais je t'avoue que j'ai du mal à décoder ton pattern : peux-tu me détailler ce que ça fait, çe me permettrait d'en apprendre un peu plus sur les regexp :jap:
(en gros, ce que je ne comprends pas, c'est surtout ^| et $|)


Message édité par nero27 le 04-01-2006 à 12:17:22
Reply

Marsh Posté le 04-01-2006 à 13:16:40    

Euh, j'utilise souvent les RegEx, mais sur ce coup, j'avoue ne pas trop bien saisir non plus les $| et ^|
 
Je sais ^foo veut dire une chaine qui commence par "foo"
bar$ une chaine qui fini par "bar"
^(foo|bar) une chaine qui commence par "foo" OU par "bar"
 
Mais alors (^|...) ça je vois pas :D


Message édité par Dj YeLL le 04-01-2006 à 13:19:27

---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 04-01-2006 à 13:41:16    

En fait ce que je comprends avec ça :
 
(^|\[/code\])(.*?)
 
C'est "si la ligne commence par "blablablabla" OU si la ligne contient [/code]"blablablabla"
 
(blablablabla étant le (.*?)


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 04-01-2006 à 14:09:18    

Oui, ça doit être ça, sinon, j'ai de nouveau un problème :
Ca fonctionne pour les img et les quote, mais pas pour les b,i et u :pt1cable:
 
Voilà le code :

Code :
  1. //u
  2. $replacement = '"$1" . preg_replace("#\[u\](.*?)\[/u\]#is", "<u>\$1</u>", "$2" ) . "$3"';
  3. $txt = preg_replace($pattern, $replacement, $txt);
  4. //i
  5. $replacement = '"$1" . preg_replace("#\[i\](.*?)\[/i\]#is", "<i>\$1</i>", "$2" ) . "$3"';
  6. $txt = preg_replace($pattern, $replacement, $txt);
  7. //b
  8. $replacement = '"$1" . preg_replace("#\[b\](.*?)\[/b\]#is", "<b>\$1</b>", "$2" ) . "$3"';
  9. $txt = preg_replace($pattern, $replacement, $txt);
  10. //quote
  11. $replacement = '"$1" . preg_replace("#\[quote\](.*?)\[/quote\]#is", "<table align=\'center\' width=\'95%\'><tr><td><b>Citation :</b></td></tr><tr><td class=\'quote\'>\$1</td></tr></table>", "$2" ) . "$3"';
  12. $txt = preg_replace($pattern, $replacement, $txt);
  13. //img
  14. $replacement = '"$1" . preg_replace("#\[img\](.*?)\[/img\]#is", "<img src=\"\$1\" />", "$2", 10) . "$3"';
  15. $txt = preg_replace($pattern, $replacement, $txt, 10);

Message cité 1 fois
Message édité par nero27 le 04-01-2006 à 14:09:32
Reply

Marsh Posté le 04-01-2006 à 15:08:29    

il y a des gros problèmes de sécurité dans ton code hélas
genre on va pouvoir executer du code php en postant sur ton forum ^^

Reply

Marsh Posté le 04-01-2006 à 16:48:59    

Citation :


En fait ce que je comprends avec ça :  
 
(^|\[/code\])(.*?)  
 
C'est "si la ligne commence par "blablablabla" OU si la ligne contient [/code]"blablablabla"  
 
(blablablabla étant le (.*?)


 
Valà.
 

nero27 a écrit :

Oui, ça doit être ça, sinon, j'ai de nouveau un problème :
Ca fonctionne pour les img et les quote, mais pas pour les b,i et u :pt1cable:


 
Soit plus clair. Ca ne transforme rien ? Ou ça transforme aussi ce qu'il y a dans un [ code ] [ / code ] ?
 
 
soju > tu veux dire profiter de l'option "e" du replace ? Je vois pas trop comment c'est possible. [:figti]

Message cité 1 fois
Message édité par sielfried le 04-01-2006 à 16:49:19

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-01-2006 à 17:37:44    

Citation :

]il y a des gros problèmes de sécurité dans ton code hélas
genre on va pouvoir executer du code php en postant sur ton forum ^^


Ah oui, comment ça ?
 

Citation :

Soit plus clair. Ca ne transforme rien ? Ou ça transforme aussi ce qu'il y a dans un [ code ] [ / code ] ?


Ca fonctionne pour quote et img, mais ça ne fonctionne pas pour b,u et i (ça transforme tout le temps, même lorsque c'est entre [ code] et [/code]) :/


Message édité par nero27 le 04-01-2006 à 17:44:08
Reply

Marsh Posté le 04-01-2006 à 17:41:21    

sielfried a écrit :

soju > tu veux dire profiter de l'option "e" du replace ? Je vois pas trop comment c'est possible. [:figti]

oups je n'ai rien dit, j'ai creusé un peu mais j'avais mal lu ta regexp
toutes mes excuses  :jap:


Message édité par soju le 04-01-2006 à 17:50:09
Reply

Marsh Posté le 04-01-2006 à 17:52:03    

Ouf, ça me rassure :D
 
Et sinon, pour ce problème de [ b], [ u] et [ i], vous voyez d'où ça peut venir ?
EDIT: au temps pour moi, l'erreur est de moi, j'avais oublié d'enlever les anciens str_replace :pfff:  
 [:dehors2]


Message édité par nero27 le 04-01-2006 à 17:53:06
Reply

Marsh Posté le 04-01-2006 à 18:41:39    

Autre petit problème : maintenant, les apostrophes dans les messages se retrouvent avec autant d'antislashes devant que de remplacement :/
 
Voilà le code :

Code :
  1. $pattern = "#(^|\[/code\])(.*?)($|\[code\])#ise";
  2. //u
  3. $replacement = '"$1" . preg_replace("#\[u\](.*?)\[/u\]#is", "<u>\$1</u>", "$2" ) . "$3"';
  4. $txt = preg_replace($pattern, $replacement, $txt);
  5. //i
  6. $replacement = '"$1" . preg_replace("#\[i\](.*?)\[/i\]#is", "<i>\$1</i>", "$2" ) . "$3"';
  7. $txt = preg_replace($pattern, $replacement, $txt);
  8. //b
  9. $replacement = '"$1" . preg_replace("#\[b\](.*?)\[/b\]#is", "<b>\$1</b>", "$2" ) . "$3"';
  10. $txt = preg_replace($pattern, $replacement, $txt);
  11. //quote
  12. $replacement = '"$1" . preg_replace("#\[quote\](.*?)\[/quote\]#is", "<table align=\"center\" width=\"95%\"><tr><td><b>Citation :</b></td></tr><tr><td class=\"quote\">\$1</td></tr></table>", "$2" ) . "$3"';
  13. $txt = preg_replace($pattern, $replacement, $txt);
  14. //quote=
  15. $replacement = '"$1" . preg_replace("#\[quote=(.*?)\](.*?)\[/quote\]#is", "<table align=\"center\" width=\"95%\"><tr><td><b>\$1 a écrit :</b></td></tr><tr><td class=\"quote\">\$2</td></tr></table>", "$2" ) . "$3"';
  16. $txt = preg_replace($pattern, $replacement, $txt);
  17. //img
  18. $replacement = '"$1" . preg_replace("#\[img\](.*?)\[/img\]#is", "<img src=\"\$1\">", "$2", 10) . "$3"';
  19. $txt = preg_replace($pattern, $replacement, $txt, 10);
  20. //url
  21. $replacement = '"$1" . preg_replace("#\[url\](.*?)\[/url\]#is", "<a href=\"\$1\">\$1</a>", "$2", 10) . "$3"';
  22. $txt = preg_replace($pattern, $replacement, $txt);
  23. //url=
  24. $replacement = '"$1" . preg_replace("#\[url=(.*?)\](.*?)\[/url\]#is", "<a href=\"\$1\">\$2</a>", "$2", 10) . "$3"';
  25. $txt = preg_replace($pattern, $replacement, $txt);
  26. //size
  27. $replacement = '"$1" . preg_replace("#\[size=(.*?)\](.*?)\[/size\]#is", "<span style=\"font-size:\$1px\">\$2</span>", "$2", 10) . "$3"';
  28. $txt = preg_replace($pattern, $replacement, $txt);
  29. //color
  30. $replacement = '"$1" . preg_replace("#\[color=(.*?)\](.*?)\[/color\]#is", "<font color=\"\$1\">\$2</font>", "$2", 10) . "$3"';
  31. $txt = preg_replace($pattern, $replacement, $txt);
  32. //code
  33. $txt = preg_replace("@(\[code\])(.*?)(\[/code\])@si","<table align='center' width='95%'><tr><td><b>Code :</b></td></tr><tr><td class='quote'><pre>$2</pre></td></tr></table>",$txt);


10 remplacements, ce qui fait un final un truc du genre :

Citation :

Test de mot avec une apostrophe : l\\\\\\\\\\'arbre


Message édité par nero27 le 04-01-2006 à 18:50:47
Reply

Marsh Posté le 04-01-2006 à 19:40:17    

Ah oui c'est vrai, l'option e rajoute des slashes.
 
Bon ben remplace dans les preg_replace "internes"

Code :
  1. "$2"

par

Code :
  1. stripslashes("$2" )

et ça devrait le faire.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-01-2006 à 19:55:54    

Ah j'avais pas pensé à ça : merci :jap:

Reply

Marsh Posté le 05-01-2006 à 11:07:24    

Encore une petite prise de tête (dites-le si je vous saoule hein :whistle: ).
J'utilise les preg_replace pour remplacer les codes de smileys par leur image et ça ne veut pas fonctionner alors que j'utilise la même formule quasiment que pour la censure.
 
Voilà le code :
 

Code :
  1. $code = array(";)",":)",":D",":p",":lol:","^^",":|",":((",":(",":'(",":coeur:",":x",":22:",":arg:",":vomi:",":o","8o",":$",":s",":roll:",":27:",":music:",":18:",":9:",":10:","8|",":17:",":21:",":24:",":28:","8)",":zzz" );
  2. $image = array("clindoeil","sourir","gsourir","langue","lol","rire","neutre","triste","pleure","coeur","bisou","beat","zut","vomi","etonne","heberlue","confu","desole","rolleyes","honteux","music","colere","fache","touche","alouest","perplexe","imbecileheureux","determine","insomniac","perfide","cool","dort" );
  3. $desc = array("Clin d\'oeil","Content","Très content","Tire la langue","Mort de rire","Heureux","Neutre","En colère","Triste","Pleure","Coeur","Bisou","Béat","Zut","Vomi","Etonné","Héberlué","Embarrassé","Désolé","Yeux roulants","Honteux","Musique","Faché","Touché","A l'ouest","Perplexe","Imbécile heureux","Déterminé","Insomniac","Perfide","Cool","Dort" );
  4. for ($i=0;$i<count($code);$i++) {
  5.     $code2=str_replace("(","\(",str_replace(" )","\)",$code[$i]));
  6.     $image2=$image[$i];
  7.     $desc2=$desc[$i];
  8.     $pattern="#(\W)".$code2."(\W)#i";
  9.     $replacement="<img src='images/smiles/".$image2.".gif' alt='".$desc2."' border='0'>";
  10.     $txt=preg_replace($pattern,"$1".$replacement."$2",$txt);
  11. }
  12. echo $txt;


En gros, j'ai testé avec ceci : test :lol: 8)
 
Et ça retourne la même chose sans modification :/

Message cité 1 fois
Message édité par nero27 le 05-01-2006 à 11:09:59
Reply

Marsh Posté le 05-01-2006 à 11:21:48    

il faut que tu backslashes les caractères interprétés par ta regex dans $code2.
 
Par ailleurs, ne serait-il pas plus propre de faire un tableau de tableau sur ton bouzin? un truc dans le genre:

Code :
  1. $smiley = array();
  2. $smiley[':\)'] = array(
  3. 'pic' => 'clindoeil',
  4. 'desc'=>'Clin d\'oeil');
  5. ...

Message cité 1 fois
Message édité par anapajari le 05-01-2006 à 11:24:40
Reply

Marsh Posté le 05-01-2006 à 11:29:07    

nero27 a écrit :

Encore une petite prise de tête (dites-le si je vous saoule hein :whistle: ).
 


 
Tu nous saoule ! :o
 
 
 
Nan je déconne :D La maitrise des RegEx est très difficile, mais tu verras, au bout d'un moment ça ira tout seul :)


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 05-01-2006 à 11:29:29    

anapajari a écrit :

il faut que tu backslashes les caractères interprétés par ta regex dans $code2.
 
Par ailleurs, ne serait-il pas plus propre de faire un tableau de tableau sur ton bouzin? un truc dans le genre:

Code :
  1. $smiley = array();
  2. $smiley[':\)'] = array(
  3. 'pic' => 'clindoeil',
  4. 'desc'=>'Clin d\'oeil');
  5. ...



Je backslashe déjà avec les str_replace.
 
Sinon, le tableau de tableau est peut-être un peu plus optimisé, mais c'est pas très lisible au final :/
 
Sinon, j'ai testé sans les tableaux, avec un code de smiley sans caractère qui pourrait être mal interprété et ça ne remplace rien non plus :/
D'ailleurs, si c'était une erreur de backslashe non mis, j'aurais eu des retours d'erreur, non ?

Dj YeLL a écrit :

Tu nous saoule ! :o
 
 
 
Nan je déconne :D La maitrise des RegEx est très difficile, mais tu verras, au bout d'un moment ça ira tout seul :)


Oui, j'ai remarqué que c'était assez difficile à maitriser au début, mais je trouve ça tellement puissant que je m'accroche :)


Message édité par nero27 le 05-01-2006 à 11:31:17
Reply

Marsh Posté le 05-01-2006 à 11:54:08    

marche très bien ton truc! A condition de backslasher les | et les ^  !!!
Sinon ton smiley 8| par exemple il remplace "8 ou n'importe quoi" par son image ... Du coup il remplace tout ...
 
Bref avec ce bout de code ça fait ce que tu veux:

Code :
  1. <?php
  2. $txt = "test 8)";
  3. $code = array(";\)",":\)",":D",":p",":lol:","\^\^",":\|",":\(\(",":\(",":'\(",":coeur:",":x",":22:",":arg:",":vomi:",":o","8o",":\$",":s",":roll:",":27:",":music:",":18:",":9:",":10:","8\|",":17:",":21:",":24:",":28:","8\)",":zzz" );
  4. $image = array("clindoeil","sourir","gsourir","langue","lol","rire","neutre","triste","pleure","coeur","bisou","beat","zut","vomi","etonne","heberlue","confu","desole","rolleyes","honteux","music","colere","fache","touche","alouest","perplexe","imbecileheureux","determine","insomniac","perfide","cool","dort" );
  5. $desc = array("Clin d\'oeil","Content","Très content","Tire la langue","Mort de rire","Heureux","Neutre","En colère","Triste","Pleure","Coeur","Bisou","Béat","Zut","Vomi","Etonné","Héberlué","Embarrassé","Désolé","Yeux roulants","Honteux","Musique","Faché","Touché","A l'ouest","Perplexe","Imbécile heureux","Déterminé","Insomniac","Perfide","Cool","Dort" );
  6. for ($i=0;$i<count($code);$i++) {
  7.   $pattern='#'.$code[$i].'#i';
  8.   $replacement="<img src='images/smiles/".$image[$i].".gif' alt='".$desc[$i]."' border='0'>";
  9.   $txt=preg_replace($pattern,$replacement,$txt);
  10. }
  11. print $txt;
  12. ?>


J'ai enlevés les \W qui servaient à rien dans ta regex, viré les variables "2" qui servaient aussi à rien et supprimé de str_replace qu'était tout pas beau ( à la limite fait une regex pour faire ce replace!!!)!
 
Pis j'ai pas dit que c'était plus optimisé avec un tableau de tableau. Mais juste la si tu rajoutes un smiley et que tu oublies sa desc ou son image ça merdoie. Le tableau de tableau t'évite ce genre d'oubli!!!

Message cité 1 fois
Message édité par anapajari le 05-01-2006 à 11:58:01
Reply

Marsh Posté le 05-01-2006 à 13:40:06    

anapajari a écrit :

marche très bien ton truc! A condition de backslasher les | et les ^  !!!
Sinon ton smiley 8| par exemple il remplace "8 ou n'importe quoi" par son image ... Du coup il remplace tout ...
 
Bref avec ce bout de code ça fait ce que tu veux:

Code :
  1. <?php
  2. $txt = "test 8)";
  3. $code = array(";\)",":\)",":D",":p",":lol:","\^\^",":\|",":\(\(",":\(",":'\(",":coeur:",":x",":22:",":arg:",":vomi:",":o","8o",":\$",":s",":roll:",":27:",":music:",":18:",":9:",":10:","8\|",":17:",":21:",":24:",":28:","8\)",":zzz" );
  4. $image = array("clindoeil","sourir","gsourir","langue","lol","rire","neutre","triste","pleure","coeur","bisou","beat","zut","vomi","etonne","heberlue","confu","desole","rolleyes","honteux","music","colere","fache","touche","alouest","perplexe","imbecileheureux","determine","insomniac","perfide","cool","dort" );
  5. $desc = array("Clin d\'oeil","Content","Très content","Tire la langue","Mort de rire","Heureux","Neutre","En colère","Triste","Pleure","Coeur","Bisou","Béat","Zut","Vomi","Etonné","Héberlué","Embarrassé","Désolé","Yeux roulants","Honteux","Musique","Faché","Touché","A l'ouest","Perplexe","Imbécile heureux","Déterminé","Insomniac","Perfide","Cool","Dort" );
  6. for ($i=0;$i<count($code);$i++) {
  7.   $pattern='#'.$code[$i].'#i';
  8.   $replacement="<img src='images/smiles/".$image[$i].".gif' alt='".$desc[$i]."' border='0'>";
  9.   $txt=preg_replace($pattern,$replacement,$txt);
  10. }
  11. print $txt;
  12. ?>


J'ai enlevés les \W qui servaient à rien dans ta regex, viré les variables "2" qui servaient aussi à rien et supprimé de str_replace qu'était tout pas beau ( à la limite fait une regex pour faire ce replace!!!)!
 
Pis j'ai pas dit que c'était plus optimisé avec un tableau de tableau. Mais juste la si tu rajoutes un smiley et que tu oublies sa desc ou son image ça merdoie. Le tableau de tableau t'évite ce genre d'oubli!!!


Merci beaucoup, ça fonctionne, j'ai juste eu à rajouter les \W (parce que dans une phrase du genre "voilà mon problème :depuis que ...", ça mettrait le :d en smiley pour rien) :jap:
EDIT: devrait penser aux \W Joce [:ddr555]


Message édité par nero27 le 05-01-2006 à 13:42:11
Reply

Marsh Posté le 05-01-2006 à 20:31:51    

Ca fonctionne, sauf pour les codes ":zzz" et ":$" :/

Reply

Marsh Posté le 05-01-2006 à 21:00:17    

Code :
  1. <?php
  2. $txt = "test :$";
  3. $code = array(";)",":)",":D",":p",":lol:","^^",":|",":((",":(",":'(",":coeur:",":x",":22:",":arg:",":vomi:",":o","8o",":$",":s",":roll:",":27:",":music:",":18:",":9:",":10:","8|",":17:",":21:",":24:",":28:","8)",":zzz" );
  4. $image = array("clindoeil","sourir","gsourir","langue","lol","rire","neutre","triste","pleure","coeur","bisou","beat","zut","vomi","etonne","heberlue","confu","desole","rolleyes","honteux","music","colere","fache","touche","alouest","perplexe","imbecileheureux","determine","insomniac","perfide","cool","dort" );
  5. $desc = array("Clin d\'oeil","Content","Très content","Tire la langue","Mort de rire","Heureux","Neutre","En colère","Triste","Pleure","Coeur","Bisou","Béat","Zut","Vomi","Etonné","Héberlué","Embarrassé","Désolé","Yeux roulants","Honteux","Musique","Faché","Touché","A l'ouest","Perplexe","Imbécile heureux","Déterminé","Insomniac","Perfide","Cool","Dort" );
  6. for ($i=0;$i<count($code);$i++) {
  7.     $pattern='#'.preg_quote($code[$i],'#').'#i';
  8.     $replacement="<img src='images/smiles/".$image[$i].".gif' alt='".$desc[$i]."' border='0'>";
  9.     $txt=preg_replace($pattern,$replacement,$txt);
  10. }
  11. print $txt;
  12. ?>


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 06-01-2006 à 10:12:39    

là :$ fonctionne, mais toujours pas :zzz :pfff:  
 
Je vais bien réussir à trouver ce qui ne va pas :D

Reply

Marsh Posté le 06-01-2006 à 10:27:12    

nero27 a écrit :

là :$ fonctionne, mais toujours pas :zzz :pfff:  
 
Je vais bien réussir à trouver ce qui ne va pas :D


 
Chez moi ça marche.
 
Et d'ailleurs le :zzz fonctionnait même avant que je fasse la modif (pas :$ par contre)


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 06-01-2006 à 10:43:22    

Je viens de trouver : le smiley est en toute fin du texte et le saut de ligne n'est pas pris en compte par le \W :/
 
EDIT: c'est bon, j'ai rajouté |$

Code :
  1. $pattern='#(\W)'.preg_quote($code[$i],'#').'(\W|$)#i';


Message édité par nero27 le 06-01-2006 à 10:52:51
Reply

Marsh Posté le 06-01-2006 à 11:12:40    

Tu peux mettre ça aussi je pense :
 
$pattern='#[\b\s]'.preg_quote($code[$i],'[\b\s]#').'#i';


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le 06-01-2006 à 11:25:10    

Tu veux dire :

Code :
  1. $pattern='#[\b\s]'.preg_quote($code[$i],'#').'[\b\s]#i';


Non ?
 
Sinon, ça a quoi de mieux au juste ?

Message cité 1 fois
Message édité par nero27 le 06-01-2006 à 11:25:34
Reply

Marsh Posté le 06-01-2006 à 12:26:12    

nero27 a écrit :

Tu veux dire :

Code :
  1. $pattern='#[\b\s]'.preg_quote($code[$i],'#').'[\b\s]#i';


Non ?
 
Sinon, ça a quoi de mieux au juste ?


 
Euh, oui :D
 
Sinon ça t'évite ton (\W|$)


---------------
Gamertag: CoteBlack YeLL
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed