:o et :ouch:, comment les départager ?

:o et :ouch:, comment les départager ? - PHP - Programmation

Marsh Posté le 25-07-2007 à 23:57:35    

J'me suis développé un p'tit blog il y a un an pour me mettre au php. C'était marrant, je m'en suis servi pendant 1 an et là j'veux y ajouter des smileys, mais j'en chie un brin :D
En fait, j'arrive pas à départager les smileys dans les cas suivants :
:o et :ouch:
:p et :pfff:  
etc...
 
A chaque fois, quand je fais le :ouch: ou le :pfff:, les deux premiers caractères (:o ou :p) sont échangés par les autres smileys.  
Comment faire pour éviter ça ?

Reply

Marsh Posté le 25-07-2007 à 23:57:35   

Reply

Marsh Posté le 25-07-2007 à 23:59:22    

Tu traites les :ouch: et :pfff: en premier, puis les :o et :p


Message édité par WiiDS le 25-07-2007 à 23:59:34

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 26-07-2007 à 00:04:41    

C'est ce que j'avais fait, mais ça ne marchait pas, en fait.
Dans un cas, j'ai que des :o, dans l'autre, j'ai des :ouch: foireux.  
Par contre, j'viens de trouver la solution. J'étais dessus depuis 4h, fallait que je poste pour trouver :D  
Dans le regex, j'ai donc mis un '(^:o)' au lieu de seulement ':o' et ça fonctionne !


Message édité par godbout le 26-07-2007 à 00:06:26
Reply

Marsh Posté le 26-07-2007 à 00:06:02    

Ah putain nan ca marche pas non plus comme ça, si le smiley est dans une phrase ça foire. Super :/

Reply

Marsh Posté le 26-07-2007 à 00:24:37    

Si je les mets dans l'ordre que tu me dis, ça devrait marcher, mais mon pb alors est là :
 

Code :
  1. $search = array( '/\[img]([^][<>]*)\[\/img]/',
  2.  '/\[url]([^][<>]*)\[\/url]/',
  3.  '/\[url=([^][<>]*)](.*)\[\/url]/',
  4.  '/:ouch:/',
  5.  '/:o/',
  6.  '/:pfff:/',
  7.  '/:p/',
  8.  '/;\)/'
  9. );
  10. $replace = array( '<img src="$1"></img>',
  11.  '<a href="$1">$1</a>',
  12.  '<a href="$1">$2</a>',
  13.  '<img src="../images/biggrin.gif" title=":D"></img>',
  14.  '<img src="../images/ouch.gif" title=":ouch:"></img>',
  15.  '<img src="../images/redface.gif" title=":o"></img>',
  16.  '<img src="../images/pfff.gif" title=":pfff:"></img>',
  17.  '<img src="../images/tongue.gif" title=":p"></img>',
  18.  '<img src="../images/wink.gif" title=";)"></img>'
  19. );
  20. $HTML = preg_replace( $search, $replace, $BBCode );


 
Le :ouch: est remplacé par le lien vers la bonne image, mais ensuite le title=":ouch:" est lui aussi remplacé par le lien vers l'image, et ça fout tout le bordel.

Message cité 1 fois
Message édité par godbout le 26-07-2007 à 00:24:52
Reply

Marsh Posté le 26-07-2007 à 00:30:34    

godbout a écrit :

Si je les mets dans l'ordre que tu me dis, ça devrait marcher, mais mon pb alors est là :

 
Code :
  1. $search = array( '/\[img]([^][<>]*)\[\/img]/',
  2.  '/\[url]([^][<>]*)\[\/url]/',
  3.  '/\[url=([^][<>]*)](.*)\[\/url]/',
  4.  '/:ouch:/',
  5.  '/:o/',
  6.  '/:pfff:/',
  7.  '/:p/',
  8.  '/;\)/'
  9. );
  10. $replace = array( '<img src="$1"></img>',
  11.  '<a href="$1">$1</a>',
  12.  '<a href="$1">$2</a>',
  13.  '<img src="../images/biggrin.gif" title=":D"></img>',
  14.  '<img src="../images/ouch.gif" title=":ouch:"></img>',
  15.  '<img src="../images/redface.gif" title=":o"></img>',
  16.  '<img src="../images/pfff.gif" title=":pfff:"></img>',
  17.  '<img src="../images/tongue.gif" title=":p"></img>',
  18.  '<img src="../images/wink.gif" title=";)"></img>'
  19. );
  20. $HTML = preg_replace( $search, $replace, $BBCode );
 

Le :ouch: est remplacé par le lien vers la bonne image, mais ensuite le title=":ouch:" est lui aussi remplacé par le lien vers l'image, et ça fout tout le bordel.


Mets le mode Ungreedy ( U ) [:spamafote]

 

PS : Tu peux aussi mettre une légende plus explicite pour ton title et ca arrangerait le problème ;)


Message édité par WiiDS le 26-07-2007 à 00:31:24

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 26-07-2007 à 01:32:01    

J'connaissais pas le mode Ungreedy. J'ai essayé, ça n'a rien changé. Soit je ne sais pas l'utiliser, soit ça va pas sur le coup là :/
J'avais pensé à changer la légende mais bon, ça pue comme solution :D Mettre un truc du genre ": o u c h :, mais sans les espaces hein ;):p", j'trouve ça un peu naze.
Retour au début quoi, j'ai pas avancé depuis un bout de temps avec tout ça :/
Merci pour le coup de pouce en tout cas !


Message édité par godbout le 26-07-2007 à 01:32:14
Reply

Marsh Posté le 26-07-2007 à 01:40:25    

forcer des espace avant et apres les smiley ? (+ gerer un smiley en debut/fin de phrase)

Reply

Marsh Posté le 26-07-2007 à 01:54:48    

Pour ce genre de fonction, j'utiliserais plutôt preg_replace_callback.  
 
Rapidement, ça pourrait donner ça :

Code :
  1. $text = 'text :o, :ouch: !!!';
  2. function replace_sml($matches){
  3.   switch($matches[0]){
  4.     case ':o':
  5.       return '<img src="..." alt=":o">';
  6.       break;
  7.     case ':ouch:':
  8.       return '<img src="..." alt=":ouch:">';
  9.       break;
  10.     default:
  11.       return $matches[0];
  12.   }
  13. }
  14. echo preg_replace_callback('/(:\w+:?)/', 'replace_sml', $text);


Reply

Marsh Posté le 26-07-2007 à 18:51:21    

kalex, ta réponse est excellente, ça fonctionne merveilleusement bien !
Merci à tous !!!

Reply

Marsh Posté le 26-07-2007 à 18:51:21   

Reply

Marsh Posté le 26-07-2007 à 19:54:18    

A vrai dire ça marche tellement bien que j'me demande même pourquoi mon "http://' marche bien, sans me remplacer le ":/" par le smiley qui devrait. C'est pas que ça me dérange, au contraire c'est niquel ! Mais j'me pose la question quand même :D

Reply

Marsh Posté le 26-07-2007 à 19:56:04    

Ah merde, en fait c'est le :/ qui marche pas :lol:
Tout ceux à base de parenthèses, slashes ou autres foirent.

 

Oh, ça marche.
Maintenant c'est donc bien le http qui ne marche plus :D


Message édité par godbout le 26-07-2007 à 20:04:42
Reply

Marsh Posté le 26-07-2007 à 20:16:22    

Salut,
 
Dans l'expression régulière, j'ai mis un \w (tout caractère d'un mot), mais tu peux l'arranger autrement pour que ça capture exactement ce que tu souhaites. Par exemple, ton expression pourrait être :
 

/(:\w+:?|\;\)|:[\)\(])/

Reply

Marsh Posté le 26-07-2007 à 20:29:29    

Salut !
 
Voilà ce que j'ai mis en fait :  
 

'/:(\)|\w+|\(|\\\):?/


 
Du coup je récupère bien mes parenthèses et, en fait, l'antislash. J'ai préféré mettre un :\ plutôt qu'un :/, comme ça je galère pas avec mon http://. C'est un peu le bordel, chaque truc que j'implémente fout la merde ailleurs :D. Bon, du coup j'ai pas fait comme je voulais, mais ça m'évite de passer 3 jours et de perdre 550 000 cheveux pour un truc de rien du tout.
 
Sinon, autre petite question si ça te dérange pas :D
 
J'ai une autre regex qui est sensée me prendre les <img></img> pour me transformer les hauteurs/largeurs. Bref, le truc c'est que ça prend maintenant les smileys, ce que je voudrais éviter.
 
Ma regex est :  

'/\<img src=\"([^][<>]*)\"\>\<\/img\>/'


 
Comment faire pour lui indiquer de ne pas prendre les <img> qui ont un title ? J'ai essayé plusieurs combines, pas trouvé...

Reply

Sujets relatifs:

Leave a Replay

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