有没有办法检查JS中的一个字符串是不是一个单独的表情符号? [英] Is there a way to check if a string in JS is one single emoji?
本文介绍了有没有办法检查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.1
str.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.2
regex.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.1
str.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.2
regex.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屋!
查看全文