Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP - preg_replace - emotikony
Forum PHP.pl > Forum > PHP
Michael2318
Witam.

Posiadam w jednej tablicy skupione kody emotikonek oraz adres url prowadzący do nich. Dane mam zgromadzone w ten sposób:

  1. $smilies = array(
  2. array(':)', 'http://strona.pl/obraz.png'),
  3. array(';)', 'http://strona.pl/obraz2.png'),
  4. ...
  5. );


I tutaj podmiana kodów na adresy URL prowadzace do ikonek:

  1. foreach($smilies as $emoticon)
  2. {
  3. $quoted_emoticon = preg_quote($emoticon[1],"#");
  4. $match = '#(?!<\w)(' . $quoted_emoticon .')(?!\w)#';
  5. $message = preg_replace($match,'<img src="'.$emoticon[0].'">',$message);
  6. }


Problem mam jednak taki z tym wyrażeniem regularnym, że podmienia mi wszystko jak leci, nawet w adresy url wstawiane mam ikonki, np.: "http://onet.pl/". Skrypt w pogrubionym fragmencie wstawia mi ikonę.
Co bym chciał zmienić - chciałbym żeby skrypt wstawiał mi obrazki z emotikonami tylko wtedy, gdy kod tej emotikonki jest oddzielony z obu stron spacjami, przykład:

Cytat
Tutaj wyświetli :--) emotikonę.


lub w przypadku, gdy jest to koniec bądź też początek tekstu, przykład:

Cytat
:--) Tutaj wyświetli emotikonę (emotikona jest na początku tekstu, więc nie ma potrzeby dodawania spacji od lewej strony).


Cytat
Tutaj wyświetli emotikonę (emotikona jest na końcu tekstu, więc nie ma potrzeby dodawania spacji od prawej strony) :--)


W pozostałych przypadkach chciałbym, aby emotikona nie była wyświetlana/zamieniana. Czy ktoś byłby w stanie mi pomóc z tym wyrażeniem regularnym, tak aby spełniło ono moje oczekiwania? Sam nie potrafię sobie z tym poradzić.

Dzięki.
lukaskolista
  1. $content = str_replace(array_keys($emoticons), array_values($emoticons), $content);

Powyższe nie musi (i nie powinno) być w pętli.
Michael2318
W porządku tylko to nadal nie rozwiązuje mojego problemu. Sama zamiana na sztywno kodów na odpowiednik obrazków to nie problem. Problemem dla mnie jest zamiana tych grafik tylko wtedy, kiedy obok kodów są spacje (min, jedna spacja z lewej i jedna z prawej strony kodu) lub wtedy kiedy kod emotikony jest na początku lub na końcu stringa - wtedy będzie tylko jedna spacja:
- jeśli kod emotikony jest na początku stringa to spacja będzie tylko z prawej strony kodu,
- jeśli kod emotikony jest na końcu stringa to spacja będzie tylko z lewej strony kodu.

Jak do tego podejść?

EDIT:

Rozwiązanie:

  1. $match = '#(?!<\S)(' . $quoted_emoticon .')(?!\S)#';
Pyton_000
użyj \b z obu stron

Bo jak dasz smile.gif. To Ci nie zadziała
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.