regex — PHP: Как сопоставить диапазон юникодных парных суррогатов смайликов / смайликов?

анубхаваответ о совпадении диапазонов символов Юникода привел меня к регулярному выражению, которое я использовал для очистки определенного диапазона символов кода. С этим теперь я могу соответствовать всем разные символы в этом списке (включает смайлики) с этим простым выражением:

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.

Я скучаю по какой-нибудь альтернативе «побега»?

0

Решение

комментарий 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);

Вот доказательство рево в 3v4l.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]