有没有办法检查JS中的一个字符串是不是一个单独的表情符号? [英] Is there a way to check if a string in JS is one single emoji?

查看:0
本文介绍了有没有办法检查JS中的一个字符串是不是一个单独的表情符号?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题很简单:我有一个字符串str,我如何检查str是否只是一个表情符号,而不是其他表情符号?此外,我不希望使用其他库。

匹配"🍎""⛹🏿‍♂️""3️⃣",但不匹配"🍓a""𝕒""🍌🍀"

我在寻找解决方案时遇到了困难,但以下是我到目前为止尝试过的一些方法:


尝试的解决方案1-绕过长度和...运算符

我了解到,表情符号占用不止一个字节,有些甚至占用4个字节,甚至更多……我们可以通过字符串的length属性:

来衡量
console.log("🍎".length); // 2
console.log("🛡️".length); // 3
console.log("⛹🏿‍♂️".length); // 6

然后我发现...运算符考虑到了这一点,并正确地分隔数组中的emoji-然后我可以看到结果数组的length属性并检测它们是否不同。

str = "⛹🏿‍♂️";
if (str.length !== [...str].length) {
  // is emoji?
} else {
  // is not emoji
}

但这不会检查其他多字节字符,例如长度为2的𝕡。此外,一些表情符号仍以奇怪的字符分隔。


尝试的解决方案2-正则表达式、正则表达式

当然,正则表达式是一个需要研究的问题,但我还没有找到可行的解决方案。

This answer的regexu00a9|u00ae|[u2000-u3300]|ud83c[ud000-udfff]|ud83d[ud000-udfff]|ud83e[ud000-udfff]可以很好地检测字符串是否有任何emoji,但应用到我的情况会产生很多问题。以下是我的测试:

A部分-不带字符串正则表达式的开始/结束(^$)

  • 2A.1str.match(regex)非常不一致,它分解了一些表情包和其他一些无法使用的表情包。我看不出它是否包含非emoji字符,或者是否包含多个emoji:
let regex = /(u00a9|u00ae|[u2000-u3300]|ud83c[ud000-udfff]|ud83d[ud000-udfff]|ud83e[ud000-udfff])/;

console.log("5️⃣".match(regex)); // [ '⃣', '⃣', index: 2, input: '5️⃣' ]
console.log("💡".match(regex)); // [ '💡', '💡', index: 0, input: '💡' ]
console.log("🌡️🌡️".match(regex)); // [ '🌡', '🌡', index: 0, input: '🌡️🌡️' ]
console.log("a⛅".match(regex)); // [ '⛅', '⛅', index: 1, input: 'a⛅' ]
  • 2A.2regex.test(str)只要字符串中包含表情符号,就返回True,这不是我想要的行为:
let regex = /(u00a9|u00ae|[u2000-u3300]|ud83c[ud000-udfff]|ud83d[ud000-udfff]|ud83e[ud000-udfff])/;

console.log(regex.test("5️⃣")); // true - correct
console.log(regex.test("a")); // false - correct
console.log(regex.test("🌡️🌡️")); // true - should be false
console.log(regex.test("hello ⛅!")); // true - should be false

B部分-字符串正则表达式的开始/结束(^$)

  • 2B.1str.match(regex)因某种原因返回某些表情包的null。我不知道为什么,但我假设它与str.match(regex)为什么会在A部分分解这些表情符号有一定关系:
let regex = /^(u00a9|u00ae|[u2000-u3300]|ud83c[ud000-udfff]|ud83d[ud000-udfff]|ud83e[ud000-udfff])$/;

console.log("5️⃣".match(regex)); // null
console.log("💡".match(regex)); // [ '💡', '💡', index: 0, input: '💡' ]
console.log("🌡️".match(regex)); // null
console.log("⛅".match(regex)); // [ '⛅', '⛅', index: 1, input: 'a⛅' ]
console.log("🍌🍀".match(regex)); // null
  • 2B.2regex.test(str)将在其将于str.match(regex)返回null的相同表情符号上返回false
let regex = /^(u00a9|u00ae|[u2000-u3300]|ud83c[ud000-udfff]|ud83d[ud000-udfff]|ud83e[ud000-udfff])$/;

console.log(regex.test("5️⃣")); // false - should be true
console.log(regex.test("💡")); // true - correct
console.log(regex.test("🌡️")); // false - should be true
console.log(regex.test("⛅")); // true - correct
console.log(regex.test("🍌🍀")); // false - correct

C部分-其他正则表达式

  • 我找到了this one,但它给出了类似的不一致,尽管不是相同的/(?:[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]|ud83cudd8e|ud83c[udd91-udd9a]|ud83c[udde6-uddff]|[ud83c[ude01uddff]|ud83c[ude01-ude02]|ud83cude1a|ud83cude2f|[ud83c[ude32ude02]|ud83cude1a|ud83cude2f|ud83c[ude32-ude3a]|[ud83c[ude50ude3a]|ud83c[ude50-ude51]|u203c|u2049|[u25aa-u25ab]|u25b6|u25c0|[u25fb-u25fe]|u00a9|u00ae|u2122|u2139|ud83cudc04|[u2600-u26FF]|u2b05|u2b06|u2b07|u2b1b|u2b1c|u2b50|u2b55|u231a|u231b|u2328|u23cf|[u23e9-u23f3]|[u23f8-u23fa]|ud83cudccf|u2934|u2935|[u2190-u21ff])/g
let 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]|ud83cudd8e|ud83c[udd91-udd9a]|ud83c[udde6-uddff]|[ud83c[ude01uddff]|ud83c[ude01-ude02]|ud83cude1a|ud83cude2f|[ud83c[ude32ude02]|ud83cude1a|ud83cude2f|ud83c[ude32-ude3a]|[ud83c[ude50ude3a]|ud83c[ude50-ude51]|u203c|u2049|[u25aa-u25ab]|u25b6|u25c0|[u25fb-u25fe]|u00a9|u00ae|u2122|u2139|ud83cudc04|[u2600-u26FF]|u2b05|u2b06|u2b07|u2b1b|u2b1c|u2b50|u2b55|u231a|u231b|u2328|u23cf|[u23e9-u23f3]|[u23f8-u23fa]|ud83cudccf|u2934|u2935|[u2190-u21ff])$/g

console.log(regex.test("5️⃣")); // true - correct
console.log(regex.test("💡")); // false - should be true
console.log(regex.test("🌡️")); // false - should be true
console.log(regex.test("⛅")); // true - correct
console.log(regex.test("🍌🍀")); // false - correct
  • 这也严重损坏(第二次测试根据第一次测试更改?)
let 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]|ud83cudd8e|ud83c[udd91-udd9a]|ud83c[udde6-uddff]|[ud83c[ude01uddff]|ud83c[ude01-ude02]|ud83cude1a|ud83cude2f|[ud83c[ude32ude02]|ud83cude1a|ud83cude2f|ud83c[ude32-ude3a]|[ud83c[ude50ude3a]|ud83c[ude50-ude51]|u203c|u2049|[u25aa-u25ab]|u25b6|u25c0|[u25fb-u25fe]|u00a9|u00ae|u2122|u2139|ud83cudc04|[u2600-u26FF]|u2b05|u2b06|u2b07|u2b1b|u2b1c|u2b50|u2b55|u231a|u231b|u2328|u23cf|[u23e9-u23f3]|[u23f8-u23fa]|ud83cudccf|u2934|u2935|[u2190-u21ff])$/g

console.log(regex.test("⛹🏿‍♂️")); // false
console.log(regex.test("⛅")); // true
let 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]|ud83cudd8e|ud83c[udd91-udd9a]|ud83c[udde6-uddff]|[ud83c[ude01uddff]|ud83c[ude01-ude02]|ud83cude1a|ud83cude2f|[ud83c[ude32ude02]|ud83cude1a|ud83cude2f|ud83c[ude32-ude3a]|[ud83c[ude50ude3a]|ud83c[ude50-ude51]|u203c|u2049|[u25aa-u25ab]|u25b6|u25c0|[u25fb-u25fe]|u00a9|u00ae|u2122|u2139|ud83cudc04|[u2600-u26FF]|u2b05|u2b06|u2b07|u2b1b|u2b1c|u2b50|u2b55|u231a|u231b|u2328|u23cf|[u23e9-u23f3]|[u23f8-u23fa]|ud83cudccf|u2934|u2935|[u2190-u21ff])$/g;

console.log(regex.test("⛹")); // true
console.log(regex.test("⛅")); // false

有没有办法绕过所有这些表情符号/Unicode/regex的烂摊子?库/API是唯一的方法吗?他们如何做到这一点?

推荐答案

使用此库:https://github.com/foliojs/grapheme-breaker尝试:

var str = "⛹🏿‍♂️";
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(str).length);

并且长度应返回%1。

这篇关于有没有办法检查JS中的一个字符串是不是一个单独的表情符号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆