php найти emoji

Я пытаюсь обнаружить emoji в моем php-коде и запретить пользователям вводить его.

Код, который у меня есть:

if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) > 0) { //warning... } 

Но не работает для всех эможи. Есть идеи?

 if(preg_match('/\xEE[\x80-\xBF][\x80-\xBF]|\xEF[\x81-\x83][\x80-\xBF]/', $value) 

Вы действительно хотите совместить Unicode на уровне символов, а не пытаться отслеживать последовательности байтов UTF-8. Используйте модификатор u для обработки строки UTF-8 на основе символа.

Эможи кодируются в блоке U + 1F300-U + 1F5FF. Однако:

  • многие персонажи из наборов «emoji» японских носителей фактически отображаются на существующие символы Юникода, например, карточные костюмы, знаки зодиака и некоторые стрелки. Вы считаете эти символы «emoji» сейчас?

  • все еще существуют системы, которые не используют недавно стандартизованные коды кода Unicode, вместо использования специальных диапазонов в области частного использования. У каждого перевозчика были свои собственные кодировки. iOS 4 использовал набор Softbank. Больше информации. Возможно, вы захотите заблокировать всю частную область использования.

например:

 function unichr($i) { return iconv('UCS-4LE', 'UTF-8', pack('V', $i)); } if (preg_match('/['. unichr(0x1F300).'-'.unichr(0x1F5FF). unichr(0xE000).'-'.unichr(0xF8FF). ']/u'), $value) { ... } 

Из Википедии:

Ядро emoji, установленное как Unicode 6.0, состоит из 722 символов, из которых 114 символов сопоставляются последовательностям одного или нескольких символов в стандарте Unicode до 6.0, а остальные 608 символов соответствуют последовательностям одного или нескольких символов, введенных в Unicode 6.0 [4]. Для emoji не существует отдельного блока, который был закодирован в семи разных блоках (некоторые недавно созданы), и существует файл данных Unicode с именем EmojiSources.txt, который включает сопоставления с традиционными наборами японских поставщиков и с ними.

Вот файл сопоставления . В файле 722 строки, каждая из которых представляет один из 722 смайликов.

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

Вы можете подобрать отдельный юникод, например:

 \x{1F30F} 

1F30F – это юникод для смайлика земного шара.

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

Правильный ответ – обнаружить, где у вас назначенная кодовая точка в блоке Miscellaneous_Symbols_And_Pictographs . В Perl вы будете использовать

  /\p{Assigned}/ && \p{block=Miscellaneous_Symbols_And_Pictographs}/ 

или просто

 /\P{Cn}/ && /\p{Miscellaneous_Symbols_And_Pictographs}/ 

которые вы должны объединить в один шаблон с

 /(?=\p{Assigned})\p{Miscellaneous_Symbols_And_Pictographs}/ 

Я не помню, имеет ли библиотека PCRE, используемая PHP, доступ к требуемым свойствам символов Юникода. Мое воспоминание о том, что оно довольно слабое в этой конкретной области. Я думаю, что у вас есть только свойства сценария Unicode и общие категории. Вздох.

Иногда вам просто нужно использовать настоящую вещь.

Из-за недостаточной поддержки Unicode вам, возможно, придется перечислить блок самостоятельно:

 /(?=\P{Cn})[\x{1F300}-\x{1F5FF}]/ 

Похож на кошмар для меня, полный волшебных чисел.

Вот что я сегодня придумал. Вероятно, это не очень хорошее решение этой проблемы, но, по крайней мере, это работает;)

 if(iconv('Windows-1250', 'UTF-8', iconv('UTF-8', 'Windows-1250', $value)) != $value)