2016-11-30 31 views
5

Byłem trochę zmaga się trochę ...PHP tekst do emotikonów

Rozejrzałem się wokół 5 StackOverflow pytania na ten temat, ale żaden z nich nie wydawał się działać tak, mam na myśli. Zasadniczo po prostu chcę zastąpić "słowa" emotikonami.

Problem polega na tym, że chcę przekonwertować słowo tylko, gdy słowo nie jest częścią innego słowa.

Jest to kod mam tak daleko:

$text = ":D i dont kn:ow about this :O i just want to :) and :D everyday:P"; 
$icons = array(
     ':)' => '<img class="postemot" src="/emoticons/smile_yell.png" />', 
     ':D' => '<img class="postemot" src="/emoticons/laugh_yell.png" />', 
     ':(' => '<img class="postemot" src="/emoticons/sad_yell.png" />', 
     '>:O' => '<img class="postemot" src="/emoticons/scared_yell.png" />', 
     ':p' => '<img class="postemot" src="/emoticons/tongue_yell.png" />', 
     ':P' => '<img class="postemot" src="/emoticons/tongue_yell.png" />', 
     ':O' => '<img class="postemot" src="/emoticons/surprised_yell.png" />', 
     ':o' => '<img class="postemot" src="/emoticons/surprised_yell.png" />' 
    ); 
    foreach($icons as $icon=>$image) { 
      $icon = preg_quote($icon); 
      $text = preg_replace("~\b$icon\b~",$image,$text); 
    } 
    echo $text; 

Ale to po prostu nie działa. Wynik był niepoprawny. W rzeczywistości jedyną emulacją wyjściową była ostatnia, "codzienna: P", która jest niepoprawna.

+1

Rzeczy, które należy wziąć pod uwagę ... kiedy emotikon jest częścią innego słowa? co oddziela emotikon od słów ??? –

+0

@Hallur - To nie jest to, co je oddziela. To sprawia, że ​​są one akceptowane jako emotikony. Na przykład, gdy emotikon jest sam, bez innych liter wokół niego, wyprowadźmy go. Nie wiem, co masz na myśli mówiąc szczerze ... –

+0

Ikona $ może zawierać nawias otwierający i zamykający; te muszą zostać usunięte w regex. – JosefScript

Odpowiedz

4

Stosowanie haseł metaznaki brzegowe wokół emotikonów nie jest w porządku, ponieważ \b pasuje do stanowiska, że ​​nie jest pożądany:

everyday:P 
     ^asserts right before here 

Więc trzeba pracować z innym stwierdzeniem użyciu lookarounds celu zapewnienia emotikon nie jest otoczony przez nie- space character:

(?<!\S)$icon(?!\S) 
+0

Po prostu, aby zauważyć, można to zrobić bez regex: '$ text = str_replace (" ikona $ "," obraz $ ", "$ text"); ' –