JavaScript中查找字符串中的表情符号并解析

17

经过大量的研究,我发现可以使用Twemoji库实时解析表情符号。

现在,我需要找出如何识别文本中是否含有表情符号,获取该表情符号的位置并执行解析函数。

下面是一些示例文本:

It is a great day .

需要在整个字符串中找到符号,使用以下函数获取其十六进制代码,返回代理对并解析使用Twemoji库。

function entityForSymbolInContainer(selector) {
    var code = data.message.body.codePointAt(0);
    var codeHex = code.toString(16);
    while (codeHex.length < 4) {
        codeHex = "0" + codeHex;
    }

    return codeHex;
}

// Get emoji hex code
    var emoji = entityForSymbolInContainer(data.message.body);
// For given an HEX codepoint, returns UTF16 surrogate pairs
    var emoji = twemoji.convert.fromCodePoint(emoji);
// Given a generic string, it will replace all emoji with an <img> tag
    var emoji = twemoji.parse(emoji);

我正在使用以下检查来查看文本中是否有表情符号。问题是对于一个简单的咧嘴笑脸()它不会向我发出警报。然而,如果我输入“衬衫和领带”(),它将向我发出警报。

var string = "It is a great day .";
var emojiRegex = /([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g;

if (string.match(emojiRegex)) {
    alert("emoji found");
}
请帮忙解决正则表达式无法识别表情符号的问题。之后,我应该能够在字符串中找到它。谢谢!

是U+1F600,它在UTF-16中编码为\uD83D\uDE00。您的正则表达式并不认为它是一个表情符号。(它停在\uD83D\uDDFF处。) - Raymond Chen
好的,谢谢您的澄清。您知道有没有更完整的正则表达式资源? - Matt Pierce
1
在开发检测表情符号的算法之前,您首先需要明确定义什么是表情符号。编写正则表达式的人没有将U+1F600视为表情符号。 - Raymond Chen
6个回答

10

现在,随着ES2018的出现,我们可以在正则表达式匹配中使用Unicode属性转义:

\p{…}

对于简单的表情符号,可以这样做:

"Be kind , smile".match(/\p{Emoji}+/gu)

对于包含使用 ZERO WIDTH JOINER 粘合的表情符号,例如 ‍‍‍,处理方式如下:

"My Family ‍‍‍".match(/[\p{Emoji}\u200d]+/gu)

短小高效!谢谢! - GuilleW
1
第二个正则表达式在多个表情符号在一起时会出错。以下是有效的:\p{Emoji}(\u200d\p{Emoji})*,因为它只匹配与零宽度连接器连接的表情符号列表,而不是将它们混合在任何地方。 - jameshfisher

7

在2021年,使用ES6带来的正则表达式中对unicode的支持是最佳的方法。

它非常简单,只需使用以下正则表达式:

/(\p{Emoji_Presentation}|\p{Extended_Pictographic})/gu

例如,这个简单的函数将用空格替换字符串中的所有表情符号:

function removeEmojis(str) {
    var emojiRE = /(\p{Emoji_Presentation}|\p{Extended_Pictographic})/gu;
    return str.replace(emojiRE, '');
}

removeEmojis('This ❌ hs some  emojis inside'); //'This  hs some  emojis inside'

它同时使用了Emoji_RepresentationExtended_Pictographic属性,因此在搜索中不计算数字、#*正如Unicode标准所示
我们也可以使用这些属性的缩写来缩短正则表达式: /(\p{EPres}|\p{ExtPict})/gu 您可以在此处测试它:

function removeEmojis(str) {
    var emojiRE = /\p{EPres}|\p{ExtPict}/gu;
    return str.replace(emojiRE, '');
}

var testStr = 'This ❌ hs some  emojis inside';
console.log('Test string: ' + testStr);
console.log('Result: ' + removeEmojis(testStr));


3
这很好,但不包括使用零宽连接器的表情符号。最终我使用了:/(\p{EPres}|\p{ExtPict})(\u200d(\p{EPres}|\p{ExtPict}))*/gu - jameshfisher

6

这篇文章给出了一个非常全面的正则表达式,用于匹配表情符号,并且有很好的解释。他的正则表达式是基于lodash库发布的那个。

(?:[\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])

https://medium.com/@thekevinscott/emojis-in-javascript-f693d0eb79fb


2

这确定评论中是否有表情符号。

var unified_emoji_ranges = ['\ud83c[\udf00-\udfff]','\ud83d[\udc00-\ude4f]','\ud83d[\ude80-\udeff]'];

var reg = new RegExp(unified_emoji_ranges.join('|'), 'g');

var string = "It is a great day .";

if (string.match(reg)) {
    alert("emoji found");
}

1
请添加解释 :) - Jack Steam
对我来说没有起作用 ✅ - SoluableNonagon

0

如果有人仍在寻找JS中查找字符串中的表情符号的解决方案。

可以使用以下(emoji-regex)。

这里是一个示例,将给定字符串中的所有表情符号转换为Unicode十六进制字符表示:

import emojiRegex  from 'emoji-regex/RGI_Emoji.js';
const emojiRegexPattern = emojiRegex();
const stringThatMightHaveEmojis = ...; //some string that can contain emoji's..

stringThatMightHaveEmojis.replace(emojiRegexPattern,(m, idx) => {
      return `${m.codePointAt(0).toString(16)}]`;
    })

在该库的文档中有更多的示例。

此外,我偶然发现了一篇有用的文章,解释如何解析表情符号,可以在这里找到codePointAt函数。


0
问题:
JavaScript将字符串定义为UTF-16代码单元序列,而不是字符或代码点序列。
(引用自下面的来源)
您必须使用代理对设置RegExp:
我在这里找到了一个很好的解决方案/解释parsing emoji unicode in javascript,它不需要额外的库。 这里还有一个在线Surrogate Pair Calculator
而在您的情况中:
/\uD83D\uDE00/

regex101


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接