@alex99505

Как правильно перевести регулярное выражение с js на php?

Есть хорошо работающее регулярное выражение на js, которое удаляет смайлики:
var regex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g;


Хорошо бы его также использовать на бекенде, php. Только что-то перевести корректно не получается.

Начал вот так, но не ясно как переводить конструкцию \ud83c[\ud000-\udfff]

$regex =preg_replace('/(\x{00a9}|\x{00ae}|[\x{2000}-\x{3300}]?/u', '', $string);
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Это суррогатные пары UTF-16, только неправильные. Вторая (нижняя) часть пары должна быть в диапазоне 0xDC00-0xDFFF. Пара преобразуется так:
CodePoint = (HighSurrogate - 0xD800) * 0x400 + LowSurrogate - 0xDC00 + 0x10000

Соответственно, группа \ud83c[\udc00-\udfff] заменяется на [\x{1F000}-\x{1F3FF}]
(0xD83C - 0xD800) * 0x400 + 0xDC00 - 0xDC00 + 0x10000 = 0x1F000
(0xD83C - 0xD800) * 0x400 + 0xDFFF - 0xDC00 + 0x10000 = 0x1F3FF

Аналогично, заменяем \ud83d[\udc00-\udfff] на [\x{1F400}-\x{1F7FF}]
\ud83e[\udc00-\udfff] на [\x{1F800}-\x{1FBFF}]

Группируем, получаем [\x{1F000}-\x{1FBFF}] или полное выражение:
~\x{a9}|\x{ae}|[\x{2000}-\x{3300}]|[\x{1F000}-\x{1FBFF}]~u

https://regex101.com/r/7nipal/1

Только версия PHP должна быть не ниже 7.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы