Javascript & 用于非英语字符检测同时忽略表情符号的正则表达式

Javascript & Regex for non-english character detecting whilst ignoring emojis

我想检测聊天应用程序中的非英语键盘字符。

现在我使用以下正则表达式来识别语言,例如俄语和普通话。

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 时,实际上

我可以清楚地看到调试中的字符串只是“嘿那里”我也尝试检查隐藏的 characters/unprintable 个字符,但它似乎没有帮助。

然后我继续检查,而不是删除带有空白的表情符号,我会使用 x 来确保每个删除的表情符号都有一个字符。当使用粘贴的返回值在 regexr 中检查时,我注意到心脏符号似乎被拾取了: 我觉得奇怪的是,当我用 '' 替换时它没有拾取任何东西,但是当我用 x 替换时它突出显示。

有什么建议吗?我的脑袋嗡嗡作响,试图解决这个问题。

看来隐藏字符有问题,表情符号的潜在范围也有问题。最后我发现有人遇到了同样的问题并制作了一个可爱的小节点打包来帮忙。

结果代码变得非常简单

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 sdfsdf df❤️口:胡震生微sd f口:胡震生微  ds