Javascript & Regex для обнаружения неанглийских символов и игнорирования смайликов - PullRequest
0 голосов
/ 11 мая 2018

Я ищу, чтобы обнаружить неанглийские символы клавиатуры в приложении чата.

Сейчас я использую следующее регулярное выражение для определения языков, например русский и мандарин.

const languageRegEx = /[^\x00-\x7F]+/gi;

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

Я попытался удалить смайлики из строки ввода, используя следующее:

const ranges = [
  '[\u00A0-\u269f]',
  '[\u26A0-\u329f]',
  // The following characters could not be minified correctly
  // if specifed with the ES6 syntax \u{1F400}
  '[?-?]'
  //'[\u{1F004}-\u{1F9C0}]'
];

function removeInvalidChars(text) {
  return text.replace(new RegExp(ranges.join('|'), 'ug'), '');
}

Кажется, что это работает хорошо, входящее сообщение, такое как:

??????❤️??????????????? Привет

Результаты:

"Привет!"

Однако, когда я передаю строку «эй, там» в мой languageRegEx, я получаю ложное срабатывание.

const languageRegEx = /[^\x00-\x7F]+/gi;
const badLanguageFound = languageRegEx.test(messageClean);

Когда badLanguageFound возвращает значение true, тогда как на самом деле

Я ясно вижу, что строка в моем отладчике просто "привет", я также пытался проверить наличие скрытых символов / непечатных символов, но, похоже, это не помогает.

Затем я проверил, что вместо удаления смайликов с пробелом, я использовал бы х, чтобы убедиться, что для каждого удаленного смайлика есть символ. При проверке этого в regexr с вставленными возвращенными значениями я заметил, что символ сердца, кажется, поднят: Emoji replacement Я нахожу странным, что когда я просто заменяю на '', он ничего не берет, но когда я заменяю на х, он подсвечивается.

Есть совет? Моя голова колотится, пытаясь разобраться с этим.

1 Ответ

0 голосов
/ 11 мая 2018

Похоже, что существует проблема со скрытыми персонажами, а также с основными причинами проблем с эмодзи. В конце концов я обнаружил, что кто-то столкнулся с этой же проблемой и создал прекрасный маленький узел, упакованный для помощи.

Результирующий код стал довольно простым

const emojiAware = require('emoji-aware');
const messageClean = emojiAware.withoutEmoji(messageText).filter(str => /\S/.test(str)).join('');
const languageRegEx = /[^\x00-\x7F]+/i; // eslint-disable-line
const badLanguageFound = languageRegEx.test(messageClean);

Это обрабатывает такие случаи как:

顶级Model白可可
亲临SHOW直播间
空投超模

????
CEO 胡震生
直播入口:胡震生微博
直播平台:一直播
房间ID:22433681
2018 05/11  22:00

и

??? sdf sdf???sdf df❤️??口:胡震生微???sd f??????口:胡震生微????  ds
...