Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.

Разбираемся как удалить emoji символы из текста пользователя

С появлением мобильных мессенджеров использование эмодзи стало неотъемлемой частью нашей жизни. Однако разработчикам приходится сталкиваться с необходимостью обработки текста, который может содержать эмодзи, например, при генерации аватарок на основе имени пользователя. Если имя содержит эмодзи, это может вызвать нежелательное поведение в процессе обработки.

При поиске способов удаления эмодзи из строки на PHP часто можно натолкнуться на подобное решение:

function remove_emoji($string)
{
    // Match Enclosed Alphanumeric Supplement
    $regex_alphanumeric = '/[\x{1F100}-\x{1F1FF}]/u';
    $clear_string = preg_replace($regex_alphanumeric, '', $string);

    // Match Miscellaneous Symbols and Pictographs
    $regex_symbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clear_string = preg_replace($regex_symbols, '', $clear_string);

    // Match Emoticons
    $regex_emoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clear_string = preg_replace($regex_emoticons, '', $clear_string);

    // Match Transport And Map Symbols
    $regex_transport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clear_string = preg_replace($regex_transport, '', $clear_string);
    
    // Match Supplemental Symbols and Pictographs
    $regex_supplemental = '/[\x{1F900}-\x{1F9FF}]/u';
    $clear_string = preg_replace($regex_supplemental, '', $clear_string);

    // Match Miscellaneous Symbols
    $regex_misc = '/[\x{2600}-\x{26FF}]/u';
    $clear_string = preg_replace($regex_misc, '', $clear_string);

    // Match Dingbats
    $regex_dingbats = '/[\x{2700}-\x{27BF}]/u';
    $clear_string = preg_replace($regex_dingbats, '', $clear_string);

    return $clear_string;
}

Хотя этот метод работает, он требует постоянного обновления диапазонов символов Unicode и может быть неэффективным в долгосрочной перспективе.

Однако существует более простое и элегантное решение, основанное на использовании регулярных выражений:

use Illuminate\Support\Str;

$text = Str::of("Сегодняшний ужин был просто восхитителен! 🍕🍣🍰")
    ->replaceMatches('/[^\p{L}\p{N}\p{Z}\p{P}]/u', '');

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

  • \p{L}: Unicode-класс символов, соответствующий любой букве.
  • \p{N}: Unicode-класс символов, соответствующий любой цифре.
  • \p{Z}: Unicode-класс символов, соответствующий любому разделителю (пробел, табуляция и т.д.).
  • \p{P}: Unicode-класс символов, соответствующий любому знаку пунктуации.

Таким образом, удаляются символы, не являющиеся буквой, цифрой, пробелом или знаком пунктуации. Это означает удаление всех символов, которые не являются частью обычного текста, включая эмодзи.

Телеграм канал где я публикую все самое интересное из разработки и там куча emoji 😎

Илья Чубаров (Переводчик)

Активный Laravel участник ✨

1

Вакансии

Спонсоры

Помощь в разработке вашего проекта на Laravel

Независимо от сложности проекта эти кампании помогают сообществу и всем его участникам воплощать идеи в элегантные приложения.

Присоединиться

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

Перейти

Подкасты c зажигательными эпизодами, которые заставят задуматься и приведут к новым перспективам.

Перейти