Предыстория

Появилась необходимость в использовании смайликов, как это реализовано в Tg:

  • Группировка смайликов по типам

  • Коллекция смайликов для вывода списка

  • Правильное хранение смайликов в бд

  • Поиск по смайликам (поиск по тегам, названию и тд)

При поиске в интернете, понял что нет такой библиотеке на PHP которая бы решила нужные мне проблемы и решил написать свою собственную библиотеку

Emoji PHP - Ссылка на GitHub: https://github.com/deniskorbakov/emoji-php

В чем заключается проблема

  • Отсутствие готового инструмента для данной задачи

  • Откуда брать актуальные смайлики

  • Хранение Unicode смайликов в базе

  • Поиск по смайликам на разных языках

Все эти проблемы удалось решить, не самым лучшим способом, но он меня вполне устраивает

Поэтому, если вам есть, что дополнить, жду ваших комментариев под постом

Далее рассмотрим как это удалось все решить

Решение проблем

  1. Отсутствие готового инструмента для данной задачи

Для этого пришлось написать свою библиотеку, ниже я покажу, что она вам может предложить по функционалу

Простое внедрение

Для того чтобы поставить пакет вам нужен PHP (версии 8.4 или выше) и composer

Скрытый текст
composer require deniskorbakov/emoji-php

После установки вы можете работать с классом для смайликов

Скрытый текст
use DenisKorbakov\EmojiPhp\Emojis;

new Emojis();

Поддержка 25 языков

Для использования поддержки разных языков я добавил в проект 25 языков который предоставлял репозиторий из второго пункта, чтобы получить мультиязычную группировку и поиск по смайликам

Список с группировкой

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

Скрытый текст
use DenisKorbakov\EmojiPhp\Emojis;
use DenisKorbakov\EmojiPhp\Locale;

new Emojis()->list(Locale::EN);
// return ['smileys & emotion' => ['?' => ':grinning_face:', ...]]

В зависимости от указанной Locale вы получите группировку по выбранному языку

Группа будет содержать Unicode(смайлик) и Short Code, который мы будем вставлять в текст или можем использовать смайлик в тексте, а с помощью метода ниже заменим при сохранении данных в базу

Замена Смайликов и Short Code в тексте

Для того чтобы заменить в тексте Unicode в Short Code и наоборот мы используем следующие методы:

Здесь мы заменяем Unicode на Short Code

Скрытый текст
use DenisKorbakov\EmojiPhp\Emojis;

$text = 'Hello, world! ?️'
  
new Emojis()->toCode($text);
// return 'Hello, world! :globe_showing_europe_africa:'

Здесь мы заменяем Short Code на Unicode

Скрытый текст
use DenisKorbakov\EmojiPhp\Emojis;

$text = 'Hello :waving_hand:';

new Emojis()->toEmoji($text);
// return 'Hello ?'

Поиск по ключевым словам

Для поиска по ключевым словам мы используем следующий метод:

Скрытый текст
use DenisKorbakov\EmojiPhp\Emojis;
use DenisKorbakov\EmojiPhp\Locale;

$searchText = 'shoe'
  
new Emojis()->search(Locale::EN, $searchText);
// return ['?' => ':mans_shoe:', ...]

Мы указываем в данном метода язык, по которому хотим произвести поиск и искомый текст

Результат получим по обычному совпадению слов в тегах искомого слова

В будущем хочу улучшить поиск, так как он не идеален, но вполне справляется для поиска по совпадениям с ключевыми словами

  1. Откуда брать актуальные смайлики

Источник актуальных смайликов, я выбрал данный репозиторий

В нем уже есть:

  • Поддержка более 25 языков

  • Short Codes по CLDR

  • Коллекция актуальных смайликов

  1. Хранение Unicode смайликов в базе

Смайлики можно хранить в БД, изменив кодировку на utf8mb4

Я где-то вычитал что Discord хранит не Unicode смайлика и некий Short Code в базе, а потом преобразует его в Unicode

Изучив тему, я понял, что можно использовать стандартизированные Short Code по спецификации CLDR

CLDR (Common Locale Data Repository) – это обширный репозиторий локальных данных, который используется программным обеспечением по всему миру для правильного отображения и работы с эмодзи, обеспечивая их согласованность и правильное значение в разных языковых средах

Во втором пункте я указал репозиторий, который уже содержит в себе CLDR Short Code для смайликов

Этим решением мы смогли решить проблему с сохранением смайликов в базе без изменения кодировки самой базы данных

  1. Поиск по смайликам на разных языках

Для своей библиотеки я хотел реализовать поиск по ключевым словам как на русском, так и на английском языке

Также из-за того что-то я выбрал сделать данное решение отрытой библиотекой то, также стоило и задуматься о других языках

Во втором пункте указан репозиторий который поддерживает более 25 языков и поэтому этот процесс занял немного времени

К сожалению, на данном этапе пришлось загружать в проект все 25 языков, что увеличивает размер пакета, в будущем хочу решить эту проблему добавив команду на добавление и удалении языков

Заключение

Я рассказал про проблему с которой столкнулся, показал решения разных нюансов и показал функционал библиотеки, которую для этого создал

Также буду рад увидеть пожелания к будущим фичам или баг-репортам в issue

GitHub - буду рад вашей подписки на меня

Благодарю вас за то, что прочитали данную статью

Комментарии (0)


  1. MadridianFox
    15.09.2025 15:00

    А смысл подписываться? Чтобы видеть новый сгенерированный через chatgpt код и его сгенерированное описание?


    1. deniskorbakov9 Автор
      15.09.2025 15:00

      Все статьи я написал сам и свои проекты, почему именно вы подумали что статью и код писала нейронка ?


      1. orl31
        15.09.2025 15:00

        рефлексы от павлова


  1. space2pacman
    15.09.2025 15:00

    use DenisKorbakov\EmojiPhp\Emojis; new Emojis();

    А зачем в PHP - DenisKorbakov?


    1. Rsa97
      15.09.2025 15:00

      PSR-0

      A fully-qualified namespace and class must have the following structure
      \<Vendor Name>\(<Namespace>\)*<Class Name>

      Так что это всего лишь Vendor Name.


    1. deniskorbakov9 Автор
      15.09.2025 15:00

      Такое я выбрал пространство имен

      Многие библиотеки используют в пути название GitHubUsername/RepositoryName