анубхаваответ о совпадении диапазонов символов Юникода привел меня к регулярному выражению, которое я использовал для очистки определенного диапазона символов кода. С этим теперь я могу соответствовать всем разные символы в этом списке (включает смайлики) с этим простым выражением:
preg_replace('/[\x{2600}-\x{26FF}]/u', '', $str);
Тем не менее, я также хочу соответствовать тем, кто в этом список парных / двойных суррогатов смайликов, но, как 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.
Я скучаю по какой-нибудь альтернативе «побега»?
комментарий Revo выше было очень полезно найти решение:
Если ваш PHP не поставляется со сборкой PCRE для UTF-16, то вы не можете выполнить такое сравнение. Начиная с PHP 7.0, вы можете использовать кодовые точки Unicode, следуя этому синтаксису
\u{XXXX}
напримерpreg_replace("~\u{1F600}~", '', $str);
(Помните двойные кавычки)
Поскольку я использую PHP 7, echo "\u{1F602}";
выходы в соответствии с этим PHP RFC страница на Unicode Escape. Это предложение было по сути:
Новая escape-последовательность добавлена для строки в двойных кавычках и наследственники.
\u{ codepoint-digits }
гдеcodepoint-digits
состоит из шестнадцатеричных цифр.
Это означает, что соответствующая строка в preg_replace
(обычно в одинарных кавычках, чтобы не перепутать расширение переменных в двойных кавычках), теперь нужны некоторые preg_quote
магия. Это решение, которое я придумал:
preg_replace(
// single point unicode list
"/[\x{2600}-\x{26FF}".
// http://www.fileformat.info/info/unicode/block/miscellaneous_symbols/list.htm
// concatenates with paired surrogates
preg_quote("\u{1F600}", '/')."-".preg_quote("\u{1F64F}", '/').
// https://www.fileformat.info/info/unicode/block/emoticons/list.htm
"]/u",
'',
$str
);
Вот доказательство вышесказанного в 3v4l.
В еще один комментарий, сделанный revo, кажется, что, помещая символы Юникода непосредственно в класс символов регулярных выражений, поддерживаются строки в одинарных кавычках и предыдущие версии PHP (например, 4.3.4):
preg_replace('/[☀-⛿-]/u','YOINK',$str);
Для использования PHP 7 новый особенность, хотя, вам все еще нужны двойные кавычки:
preg_replace("/[\u{2600}-\u{26FF}\u{1F600}-\u{1F64F}]/u",'YOINK',$str);
Других решений пока нет …