如何使用javascript检测表情符号

IT技术 javascript emoji
2021-01-15 02:54:18

我需要有关如何检测输入是否包含日语表情符号/表情符号的帮助。

目前我的字符集是charset=utf-8. 在输入文本时,用户可以输入日文字符/字母数字/符号,但如果他们插入表情符号,onsubmitJavaScript 将检查是否有表情符号,将显示错误消息。

我无法让它工作,因为我不知道如何在 JavaScript 中检测表情符号?

6个回答

答案可能有效但很糟糕,因为它们依赖于不可读且有点“神奇”的 unicode 范围,因为并不总是清楚它们来自哪里以及它们为什么起作用,更不用说它们对添加的新表情符号没有弹性规格

主要浏览器现在支持unicode 属性转义,它允许根据它们在Emojiunicode 类别中的归属来匹配表情符号\p{Emoji}匹配表情符号,\P{Emoji}匹配非表情符号。

需要注意的是正式0123456789#*和其他字符表情符号太多,所以属性逃生,你可能想使用不是Emoji,而是Extended_Pictographic它表示所有的角色通常被理解为表情符号!

确保包括u标志在最后。

console.log(
  /\p{Emoji}/u.test('flowers'), // false :)
  /\p{Emoji}/u.test('flowers 🌼🌺🌸'), // true :)
  /\p{Emoji}/u.test('flowers 123'), // true :( 
)
console.log(
  /\p{Extended_Pictographic}/u.test('flowers'), // false :)
  /\p{Extended_Pictographic}/u.test('flowers 🌼🌺🌸'), // true :)
  /\p{Extended_Pictographic}/u.test('flowers 123'), // false :)
)

这适用于检测表情符号,但如果您想使用相同的正则表达式来提取它们,您可能会对它的行为感到惊讶,因为一些显示为一个字符的表情符号实际上是几个字符。它们就是我们所说的表情符号序列,在这个问题中有更多关于它们的信息

const regex = /\p{Extended_Pictographic}/ug
const family = '👨‍👩‍👧' // "family 
console.log(family.length) // not 1, but 8!
console.log(regex.test(family)) // true, as expected
console.log(family.match(regex)) // not [family], but [man, woman, girl]

这应该是可以接受的答案。所有其他正则表达式都不是真正可维护的。
2021-03-15 02:54:18
啊,谢谢@Bronzdragon!问题更复杂,我问了另一个关于这个主题的问题并提到了你的修复,并更新了上面的答案,因为你的修复不能处理*而且#也是表情符号
2021-03-26 02:54:18
@SimplGy 感谢您发现这个问题!我相应地编辑了我的答案。
2021-03-26 02:54:18
一个很好的简单答案,但请注意,它不会像您期望的那样解释多部分表情符号。例如:'👨‍👩‍👧'.match(/\p{Extended_Pictographic}/ug) -> ["👨","👩","👧"]
2021-03-29 02:54:18
Emoji 类似乎也匹配数字。试试这个:/^\p{Emoji}*$/u.test("123") 解决这个问题的方法是这个正则表达式:/(?=\p{Emoji})(?!\p{Number})/u
2021-04-10 02:54:18

您可以使用以下正则表达式:

/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g

如果你只是想从字符串中删除它,你可以做这样的事情。

function removeEmojis (string) {
  var regex = /(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])/g;

  return string.replace(regex, '');
}
这如何处理添加到规范中的新表情符号?
2021-03-14 02:54:18
+1。我想知道它是否会像stackoverflow.com/a/20208095/470749 上的正则表达式一样更新
2021-03-19 02:54:18
对我来说很好的答案。然而,正则表达式中的一个错误导致它也匹配右括号 ([)。看起来只是复制和粘贴代码的错误,但请卢卡斯修复。在此处修复正则表达式:pastebin.com/0VZZKfWf
2021-03-23 02:54:18
@JamieStreet 你已经尝试过了吗?如果它不工作可能正则表达式,不幸的是,需要调整
2021-04-09 02:54:18
它适用于此处列出的所有表情符号:getemoji.com
2021-04-09 02:54:18

您可以使用此 lib emoji-regex 中的正则表达式

true如果您的字符串包含一个或多个表情符号,则返回一个简单的函数

function isEmoji(str) {
    var ranges = [
        '(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|[\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|[\ud83c[\ude32-\ude3a]|[\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])' // U+1F680 to U+1F6FF
    ];
    if (str.match(ranges.join('|'))) {
        return true;
    } else {
        return false;
    }
}
与 ✈️、❤️ 和 🤳 不匹配
2021-03-14 02:54:18
包含 198 个字符长的正则表达式的函数不是“简单函数”
2021-03-15 02:54:18
我们如何检测字符串是否真的只有一个表情符号?如果字符串包含表情符号,则返回 true
2021-04-11 02:54:18

我们可以检测特定范围内的所有代理对列表或表情符号字符。如果问题与将输入字符串存储到 5.5 之前的 MySQL 版本等数据库有关,我们需要使用以下正则表达式检测并删除所有代理对

/([\uD800-\uDBFF][\uDC00-\uDFFF])/g.
它不匹配⚱️和⚰️
2021-03-17 02:54:18