【问题标题】:Javascript Find Emoji in String and ParseJavascript 在字符串和解析中查找表情符号
【发布时间】:2021-09-17 17:25:37
【问题描述】:

经过大量研究,我找到了如何使用 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。)
  • 好的,感谢您的澄清。你知道更完整的正则表达式的资源吗?
  • 在开发算法来检测 emoji 之前,您首先需要对 emoji 是什么有一个清晰的定义。编写该正则表达式的人并不认为 U+1F600 是表情符号。

标签: javascript string emoji


【解决方案1】:

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

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

    \p{…}
    

    对于简单的表情符号是:

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

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

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

    【讨论】:

    • 简短,高效!谢谢!
    【解决方案3】:

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

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

    【讨论】:

    • 请补充说明:)
    【解决方案4】:

    在 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 ❌ h?s some ? emojis inside'); //'This  hs some  emojis inside'
    

    它同时使用 Emoji_RepresentationExtended_Pictographic 属性,因此在搜索中不计算数字 #* as indicated by the Unicode standard

    我们也可以使用这些属性的缩写,以获得更短的正则表达式:

    /(\p{EPres}|\p{ExtPict})/gu

    您可以在这里试驾:

    function removeEmojis(str) {
        var emojiRE = /\p{EPres}|\p{ExtPict}/gu;
        return str.replace(emojiRE, '');
    }
    
    var testStr = 'This ❌ h?s some ? emojis inside';
    console.log('Test string: ' + testStr);
    console.log('Result: ' + removeEmojis(testStr));

    【讨论】:

      【解决方案5】:

      问题:

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

      (引自以下来源)

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

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

      在你的情况下:

      /\uD83D\uDE00/
      

      regex101

      【讨论】:

        【解决方案6】:

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

        可以使用以下library(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 可以找到here

        【讨论】:

          猜你喜欢
          • 2020-07-27
          • 2016-02-14
          • 2013-10-09
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多