Javascript在String和Parse中查找表情符号

时间:2016-05-07 13:53:47

标签: javascript string emoji

经过TONS研究,我发现如何使用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");
}

请帮助解决正则表达式没有拿起表情符号的问题。在那之后,我应该能够在字符串中找到它。

谢谢!

5 个答案:

答案 0 :(得分:2)

这篇文章提供了一个非常全面的正则表达式,用于匹配表情符号和一个非常好的解释。他的正则表达基于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

答案 1 :(得分:1)

这确定注释中是否有表情符号。

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");
}

答案 2 :(得分:1)

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

\p{…}

对于简单的表情符号:

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

对于表情符号,包括像 ?‍?‍?‍? 这样用零宽度连接器粘合的字形,它可以是:

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

答案 3 :(得分:0)

问题:

  

JavaScript将字符串定义为UTF-16代码序列   单位,而不是字符序列或代码点。

(引自以下来源)

您必须使用代理对设置RegExp:

parsing emoji unicode in javascript处我找到了一个很好的解决方案/解释,没有额外的库。 这是在线Surrogate Pair Calculator

对于您的情况:

/\uD83D\uDE00/

regex101

答案 4 :(得分:0)

万一有人还在寻找JS解决方案来查找字符串中的表情符号。

可以使用以下library(表情符号正则表达式)。

以下是将所有表情符号转换为给定字符串中字符的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)}]`;
    })

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

加上我偶然发现的解释这篇表情符号的有用文章,可以找到here