Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Emotikony w komunikatorze
Forum PHP.pl > Forum > PHP
mike89
Witam!
Pracuję nad wykonaniem komunikatora i aktualnie chcę ulepszyć funkcję, którą już mam do zamieniania tekstu (np.':D') na emotikonę.
Oczywiście użyłem str_replace tak jak to już było kilkakrotnie pokazywane w innych tematach na tym forum.
Jednak chciałbym, aby funkcja brała pod uwagę takie przypadki jak .np:

-"costam:D"
-"costam:Dcostam"
-":Dcostam"

czyli miejsca gdzie emotikona w stringu łączy się z tekstem, tam chciałbym, aby nie wykonywała się zamiana.
Zamiana może się wykonywać tylko wtedy gdy po obu stronach emotikony jest albo dowolna ilość spacji (lub innych białych znaków) albo nic.
Wiem, że do tego celu można wykorzystać funkcję preg_match i wyrażenia regularne. Ktoś mógłby pomóc w stworzeniu odpowiednich warunków?
borabora
  1. function emoticons($text) {
  2. $smileys = array(
  3. ':)' => 'img1',
  4. ';)' => 'img2',
  5. ':/' => 'img3'
  6. );
  7.  
  8. foreach($smileys as $key=>$img) {
  9. $text = preg_replace("~\B".preg_quote($key)."\B~", $img, $text);
  10. }
  11. return $text;
  12. }
  13.  
  14. echo emoticons('hgasgh xttp://dsfsd.pl kjjkk:)jhjh kjjkh:) :/ jsdhj :)jhjh :) :)');
in5ane
http://stackoverflow.com/questions/5701632...n-for-emoticons Tutaj też masz kompletne wyrażenie regularne. To z pierwszego posta (po edycji).
mike89
borabora skrypt jest ok, ale zamiana nie działa w ogóle przypadku niektórych emotikon np. ':D', ':P'. Chyba ma to związek z literą alfabetu w emotikonie, ale pewności nie mam. Pozostałe działają ok.

inSane czy chodzi o wyrażenie (?<=\s|\A|\n|\r|\t|\v|\<br \/\>|\<br\>)(:S)(?=\s|\Z|$|\n|\r|\t|\v|\<br \/\>|\<br\>) ? W sumie to nie wiem jak mam tego użyć w warunku

Ktoś ma jakiś pomysł?

Ok udało mi się. Tak więc moja funkcja wygląda następująco:

  1. function replace($text){
  2.  
  3. $a = array(
  4. ':)' => '<img src="emotikony/smiley.jpg">',
  5. ':(' => '<img src="emotikony/frown.jpg">',
  6. 'biggrin.gif' => '<img src="emotikony/big-smile.jpg">',
  7. 'tongue.gif' => '<img src="emotikony/tongue-out.jpg">',
  8. ':*' => '<img src="emotikony/kiss.jpg">',
  9. ';)' => '<img src="emotikony/wink.jpg">',
  10. ':/' => '<img src="emotikony/unsure.jpg">',
  11. 'ohmy.gif' => '<img src="emotikony/surprised.jpg">'
  12. );
  13.  
  14.  
  15.  
  16. foreach ($a as $key => $img) {
  17. if(preg_match('@\s'.preg_quote($key).'\s@', $text)){
  18. $text = str_replace($key, $img, $text);
  19.  
  20. } elseif(preg_match('@\s'.preg_quote($key).'@', $text)){
  21. $text = str_replace($key, $img, $text);
  22.  
  23. } elseif(preg_match('@'.preg_quote($key).'\s@', $text)){
  24. $text = str_replace($key, $img, $text);
  25.  
  26. } elseif(preg_match('@^'.preg_quote($key).'$@', $text)){
  27. $text = str_replace($key, $img, $text);
  28. }
  29. }
  30.  
  31. return $text;
  32.  
  33. }

Teraz spełnia te warunki o których pisałem wyżej
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.