Лучший способ заменить смайлики в PHP?

Сейчас я использую эту функцию для смайликов:

function emoticons($text) { $icons = array( ':)' => '<img src="/images/blank.gif" alt="smile" class="icon_smile" />', ':-)' => '<img src="/images/blank.gif" alt="smile" class="icon_smile" />', ':D' => '<img src="/images/blank.gif" alt="smile" class="icon_laugh" />', ':d' => '<img src="/images/blank.gif" alt="laugh" class="icon_laugh" />', ';)' => '<img src="/images/blank.gif" alt="wink" class="icon_wink" />', ':P' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', ':-P' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', ':-p' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', ':p' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />', ':(' => '<img src="/images/blank.gif" alt="sad face" class="icon_sad" />', ':o' => '<img src="/images/blank.gif" alt="shock" class="icon_shock" />', ':O' => '<img src="/images/blank.gif" alt="shock" class="icon_shock" />', ':0' => '<img src="/images/blank.gif" alt="shock" class="icon_shack" />', ':|' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />', ':-|' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />', ':/' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />', ':-/' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />' ); return strtr($text, $icons); } 

Но если вы введете ссылку, будет заменена: :/ часть http:// :

введите описание изображения здесь

То же самое с кодом (4 пробела перед каждой строкой для создания кода), но по какой-то причине простой ) заменяется (подмигиванием):

введите описание изображения здесь

Есть ли лучшее решение для этого, чем замена всех значков, подобных этому? Очевидно, что это не работает. Я много искал в Google и не нашел лучшего способа. Я также попытался помещать пробел перед каждым смайликом в ассоциативном массиве выше, но это не работает, если вы просто вводите 🙂 без чего-либо перед этим.

Solutions Collecting From Web of "Лучший способ заменить смайлики в PHP?"

Вы можете использовать функцию preg_replace, а затем использовать границы слов в регулярном выражении.

  foreach($icons as $icon=>$image) { $icon = preg_quote($icon); $text = preg_replace("~\b$icon\b~",$image,$text); } 

Вам нужно использовать границы слов, а не пробелы, потому что это будет касаться начальной и конечной точек. Необходимое пространство перед означает, что просто 🙂 не будет найден.

Регулярные выражения медленны для этого, если текст большой, насколько мне нравится, вы должны вставлять только значок, если он окружен пробелами, таким образом ваши пользователи не будут буйствовать при попытке писать URL-адреса.

Я не уверен, будет ли это работать или нет, но я бы постарался добавить дополнительные пробелы:

 function emoticons($text) { $icons = array( ' :) ' => ' <img src="/images/blank.gif" alt="smile" class="icon_smile" /> ', ' :-) ' => ' <img src="/images/blank.gif" alt="smile" class="icon_smile" /> ', ' :D ' => ' <img src="/images/blank.gif" alt="smile" class="icon_laugh" /> ', ' :d ' => ' <img src="/images/blank.gif" alt="laugh" class="icon_laugh" /> ', ' ;) ' => ' <img src="/images/blank.gif" alt="wink" class="icon_wink" /> ', ' :P ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', ' :-P ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', ' :-p ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', ' :p ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ', ' :( ' => ' <img src="/images/blank.gif" alt="sad face" class="icon_sad" /> ', ' :o ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shock" /> ', ' :O ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shock" /> ', ' :0 ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shack" /> ', ' :| ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ', ' :-| ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ', ' :/ ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ', ' :-/ ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ' ); return strtr($text, $icons); } 

Я бы рекомендовал две библиотеки:

Emojify: https://github.com/HallgrenNetworks/emojify

PHP Emoji: https://github.com/iamcal/php-emoji

Они будут касаться этих случаев для вас.

Я думаю, используя регулярные выражения вместо того, чтобы просто определять ваши смайлики. Это может выглядеть так:

 // replaces a :) when it is surrounded by whitespaces return preg_replace('/\s:)\s/', '<img ...>', $text);