Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1986 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Problème avec preg_replace ...

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Problème avec preg_replace ...

n°1268702
nero27
Posté le 16-12-2005 à 19:02:51  profilanswer
 

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:

mood
Publicité
Posté le 16-12-2005 à 19:02:51  profilanswer
 

n°1268715
soju
One shot !
Posté le 16-12-2005 à 19:33:02  profilanswer
 

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);

n°1268717
nero27
Posté le 16-12-2005 à 19:34:40  profilanswer
 

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

n°1268718
soju
One shot !
Posté le 16-12-2005 à 19:36:11  profilanswer
 

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

Citation :

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


n°1268736
nero27
Posté le 16-12-2005 à 19:59:39  profilanswer
 

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

n°1274430
nero27
Posté le 29-12-2005 à 14:23:40  profilanswer
 

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
n°1274433
anapajari
s/travail/glanding on hfr/gs;
Posté le 29-12-2005 à 14:38:18  profilanswer
 

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

n°1274453
nero27
Posté le 29-12-2005 à 15:03:59  profilanswer
 

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
n°1274833
nero27
Posté le 30-12-2005 à 11:03:10  profilanswer
 

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
n°1274878
Dj YeLL
$question = $to_be || !$to_be;
Posté le 30-12-2005 à 11:38:18  profilanswer
 

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
mood
Publicité
Posté le 30-12-2005 à 11:38:18  profilanswer
 

n°1275041
sielfried
Posté le 30-12-2005 à 17:47:42  profilanswer
 

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
n°1275093
nero27
Posté le 30-12-2005 à 18:36:33  profilanswer
 

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:

n°1275119
sielfried
Posté le 30-12-2005 à 19:35:35  profilanswer
 

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
n°1275297
nero27
Posté le 31-12-2005 à 14:01:53  profilanswer
 

ok, merci pour le conseil ^^

n°1276789
nero27
Posté le 04-01-2006 à 12:16:09  profilanswer
 

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
n°1276810
Dj YeLL
$question = $to_be || !$to_be;
Posté le 04-01-2006 à 13:16:40  profilanswer
 

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
n°1276824
Dj YeLL
$question = $to_be || !$to_be;
Posté le 04-01-2006 à 13:41:16  profilanswer
 

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
n°1276845
nero27
Posté le 04-01-2006 à 14:09:18  profilanswer
 

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
n°1276905
soju
One shot !
Posté le 04-01-2006 à 15:08:29  profilanswer
 

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 ^^

n°1277000
sielfried
Posté le 04-01-2006 à 16:48:59  profilanswer
 

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
n°1277046
nero27
Posté le 04-01-2006 à 17:37:44  profilanswer
 

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
n°1277049
soju
One shot !
Posté le 04-01-2006 à 17:41:21  profilanswer
 

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
n°1277059
nero27
Posté le 04-01-2006 à 17:52:03  profilanswer
 

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
n°1277090
nero27
Posté le 04-01-2006 à 18:41:39  profilanswer
 

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
n°1277138
sielfried
Posté le 04-01-2006 à 19:40:17  profilanswer
 

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
n°1277145
nero27
Posté le 04-01-2006 à 19:55:54  profilanswer
 

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

n°1277472
nero27
Posté le 05-01-2006 à 11:07:24  profilanswer
 

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
n°1277476
anapajari
s/travail/glanding on hfr/gs;
Posté le 05-01-2006 à 11:21:48  profilanswer
 

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
n°1277478
Dj YeLL
$question = $to_be || !$to_be;
Posté le 05-01-2006 à 11:29:07  profilanswer
 

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
n°1277479
nero27
Posté le 05-01-2006 à 11:29:29  profilanswer
 

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
n°1277492
anapajari
s/travail/glanding on hfr/gs;
Posté le 05-01-2006 à 11:54:08  profilanswer
 

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
n°1277564
nero27
Posté le 05-01-2006 à 13:40:06  profilanswer
 

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
n°1277783
nero27
Posté le 05-01-2006 à 20:31:51  profilanswer
 

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

n°1277791
Dj YeLL
$question = $to_be || !$to_be;
Posté le 05-01-2006 à 21:00:17  profilanswer
 

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
n°1278017
nero27
Posté le 06-01-2006 à 10:12:39  profilanswer
 

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

n°1278027
Dj YeLL
$question = $to_be || !$to_be;
Posté le 06-01-2006 à 10:27:12  profilanswer
 

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
n°1278039
nero27
Posté le 06-01-2006 à 10:43:22  profilanswer
 

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
n°1278068
Dj YeLL
$question = $to_be || !$to_be;
Posté le 06-01-2006 à 11:12:40  profilanswer
 

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


---------------
Gamertag: CoteBlack YeLL
n°1278075
nero27
Posté le 06-01-2006 à 11:25:10  profilanswer
 

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
n°1278124
Dj YeLL
$question = $to_be || !$to_be;
Posté le 06-01-2006 à 12:26:12  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Problème avec preg_replace ...

 

Sujets relatifs
Problème de t=remplace_tag[css] problème de padding sous firefox
[RESOLU] Problème avec un IF imbriqué dans une boucle FORProblème avec l'installation d'un wiki
[HTML] Problème de tableaux avec internet explorer[GLUT] Probleme avec boucle while
Problème preg_replace() et chiffres, numéros[resolu] Probleme de PREG_REPLACE
probleme avec fonctions preg_replace 
Plus de sujets relatifs à : Problème avec preg_replace ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR