Ответ anubhava о сопоставлении диапазонов символов Юникода привел меня к регулярному выражению для очистки до определенного диапазона одиночных кодовых точек символов. Теперь я могу сопоставлять все разные символы в этом списке (включая смайлики) с помощью этого простого выражения:
preg_replace('/[\x{2600}-\x{26FF}]/u', '', $str);
Однако я также хочу сопоставить те, что указаны в этом списке парных/двойных суррогатов. emoji, но как nhahtdh объясняется в комментарий:
Существует диапазон от
d800
доdfff
для указания суррогатов в UTF-16, чтобы можно было указать больше символов. Один суррогат не является допустимым символом в UTF-16 (необходима пара, чтобы указать допустимый символ).
Так, например, когда я пытаюсь это:
preg_replace('/\x{D83D}\x{DE00}/u', '', $str);
Для замены только первого из парных заменителей в этом списке , то есть: ????
PHP бросает это:
preg_replace()
: Ошибка компиляции: недопустимая кодовая точка Unicode(>= 0xd800 && <= 0xdfff)
Я пробовал несколько разных комбинаций, включая предполагаемую комбинацию вышеуказанных кодовых точек в UTF8 для ???? ('/[\x{00F0}\x{009F}\x{0098}\x{0080}]/u'
), но я так и не смог его сопоставить. Я также изучил другие модификаторы шаблонов PCRE, но, похоже, u
— единственный, который позволяет указывать через UTF8.
Я пропустил здесь какую-либо альтернативу «побега»?
U+1F600
в\x{D83D}\x{DE00}
? - person Wiktor Stribiżew   schedule 21.08.2018\u{XXXX}
, например.preg_replace("~\u{1F600}~", '', $str);
(обратите внимание на двойные кавычки) - person revo   schedule 21.08.2018