DevGang
Авторизоваться

Как обнаружить смайлы с помощью JavaScript

Используйте регулярное выражение для сопоставления смайлов в строках.

Недавно я отфильтровал обширную ленту Twitter, чтобы проанализировать ее с помощью глубокой нейронной сети. Как вы знаете, твиты могут содержать различный контент, включая и смайлы. Итак, одним из первых шагов была чистка данных, в данном случае удаление всех смайлов из ленты.

Хотя это можно сделать разными способами, я покажу, как это сделать с помощью JavaScript, потому что это просто и быстро, так что давайте начнем.

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

Современные браузеры поддерживают свойство Unicode, которое позволяет сопоставлять эмодзи на основе их принадлежности к категории Emoji Unicode. Например, вы можете использовать экранирование свойств Unicode, такие как \p{Emoji} или \P{Emoji}, чтобы соответствовать/не соответствовать символам смайлов. Обратите внимание, что 0123456789#* и другие символы интерпретируются как смайлы при использовании предыдущей категории Unicode. Поэтому лучший способ сделать это — использовать категорию Unicode {Extended_Pictographic}, которая обозначает все символы, обычно понимаемые как смайлы, вместо категории {Emoji}.

Давайте рассмотрим некоторые примеры.

Используйте \p{} для сопоставления символов Unicode

Если вы используете категорию Unicode “Emoji”, вы можете получить неверные результаты:

const withEmojis = /\p{Emoji}/u
withEmojis.test('😀');  
//true

withEmojis.test('ab');
//false

withEmojis.test('1');  
//true  opps!
Пример 1.
Пример 1.

Поэтому лучше использовать Extended_Pictographic, как упоминалось ранее:

const withEmojis = /\p{Extended_Pictographic}/u
withEmojis.test('😀😀'); 
//true

withEmojis.test('ab');
//false

withEmojis.test('1');
//false
Пример 2.
Пример 2.

Используйте \P{}, чтобы не было совпадений.

const noEmojis = /\P{Extended_Pictographic}/u
noEmojis.test('😀'); 
//false

noEmojis.test('1212');
//false
Пример 3.
Пример 3.

Как видите, это простой способ обнаружения смайлов, но если вы используете ваше предыдущее регулярное выражение withEmojis со сгруппированными смайлами, то результат вас удивит.

const withEmojis = /\p{Extended_Pictographic}/ug

const familyEmoji = '👨‍👩‍👧' 

console.log(familyEmoji.length) 
//8

console.log(withEmojis.test(familyEmoji))
//true

console.log(familyEmoji.match(withEmojis))
//(3) ['👨', '👩', '👧']

familyEmoji.replaceAll(withEmojis,'*');
//*** opps!
Пример 4.
Пример 4.

Как вы можете видеть, если вы используете метод «replaceAll» с нашим регулярным выражением, вы получаете три: <***> вместо одного «<*.> Такое происходит потому, что сгруппированные Смайлы отображаются как один символ, но состоят из более чем одной кодовой точки.

В завершение

Чтобы избежать этого и других редких случаев, вы можете использовать такие библиотеки, как emoji-regex. Эта библиотека предлагает регулярные выражения для соответствия всем символам и последовательностям смайлов (включая текстовые смайлы) в соответствии со стандартом Unicode.

Надеюсь, эта небольшая статья будет вам полезна.

Источник:

#JavaScript
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В подарок 100$ на счет при регистрации

Получить