如何使用javascript删除表情符号代码?

man*_*j82 26 javascript unicode emoji

如何使用JavaScript删除表情符号代码?我以为我使用下面的代码照顾它,但我仍然有像这样的字符.

function removeInvalidChars() {
    return this.replace(/[\uE000-\uF8FF]/g, '');
}
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 50

您选择的范围是私人使用区域,包含非标准字符.用于将表情符号编码为此范围内的不同,不一致值的载体.

最近,表情符号已被赋予标准化的"统一"代码点.其中许多都在基本多语言平面之外,在块U + 1F300-U + 1F5FF中,包括你的例子U + 1F534大红圈.

您可以[\U0001F300-\U0001F5FF]在支持非BMP字符的正则表达式引擎中检测这些字符,但JavaScript RegExp不是这样的野兽.不幸的是,JS字符串模型基于UTF-16代码单元,因此您必须在正则表达式中使用UTF-16代理:

return this.replace(/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g, '')
Run Code Online (Sandbox Code Playgroud)

但请注意,基本多语种平面中还有其他字符被电话用作表情符号,但很久以前就是表情符号.例如,U + 2665是传统的Heart Suit角色♥,但它在某些设备上被渲染为表情符号图形.您是否将其视为表情符号并尝试将其删除,由您决定.有关更多示例,请参阅此列表.


jon*_*y89 37

对我来说,没有一个答案完全删除了所有表情符号所以我必须自己做一些工作,这就是我得到的:

text.replace(/([\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, '');
Run Code Online (Sandbox Code Playgroud)

此外,它应该考虑到如果稍后将字符串插入数据库,替换为空字符串可能会暴露安全问题.而是替换为替换字符U + FFFD,请参阅:http://www.unicode.org/reports/tr36/#Deletion_of_Noncharacters

编辑2017:我已经改变了正则表达式以包含一些新的Emojis ..

编辑2018:一些新的表情符号

  • 这涵盖了非常可靠的范围,但我不得不做一些编辑以涵盖一些遗漏.具体来说,我将现有的字符集`[\ u2694-\u2697]`扩展为`[\ u2580-\u27BF]`以包含一些额外的形状和dingbats,现在匹配常见的❤️字符(`\ u2764\uFE0F` ).我还将`\ uD83E [\ uDD10-\uDD5D]`扩展为`\ uD83E [\ uDD10-\uDDFF]`来捕捉一些表情符号,例如,,,和. (6认同)
  • 尝试了很多解决方案,但这个解决方案取得了巨大的成功!对使用Twitter API的任何人的说明 - 这对我有用! (3认同)
  • 嗨@avalanche1,是的,这就是我使用的,我最终也做了额外的改进: `/[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]| [\u2580-\u27BF]|\uD83E[\uDD10-\uDDFF]/g` (3认同)

hab*_*abr 18

我通过使用带有Unicode 属性转义的正则表达式解决了这个问题。我从这篇文章中得到它,它适用于 Java,但仍然非常有用 - Remove Emojis from a Java String

'Smile'.replace(/[^\p{L}\p{N}\p{P}\p{Z}^$\n]/gu, '');
Run Code Online (Sandbox Code Playgroud)

它删除所有符号,除了:

  • \p{L} - 来自任何语言的所有字母
  • \p{N} - 数字
  • \p{P} - 标点符号
  • \p{Z} - 空格分隔符
  • ^$\n - 添加您想要保留的任何符号

这个应该更正确并且它有效,但对我来说它在字符串中留下了一些垃圾符号:

    'Smile'.replace(/\p{Emoji}/gu, '');
Run Code Online (Sandbox Code Playgroud)

编辑:从评论中添加符号

  • 我测试了 `/\p{Emoji}/gu` 并且它删除了数值。“Test123”变成“Test”。 (3认同)

gra*_*bus 15

只是对@hababr 答案的补充。

\n

如果您需要摆脱复杂的表情符号,您还必须删除其他内容,例如修饰符等:

\n
'\xe2\x80\x8d'.replace(/[\\p{Emoji}\\p{Emoji_Modifier}\\p{Emoji_Component}\\p{Emoji_Modifier_Base}\\p{Emoji_Presentation}]/gu, '').charCodeAt(0)\n
Run Code Online (Sandbox Code Playgroud)\n

更新:

\n

*#0-9- 根据 Unicode 标准,默认情况下是具有文本表示形式的表情符号字符。

\n

所以,我当前的解决方案是:

\n
'\xe2\x80\x8d'.replace(/(?![*#0-9]+)[\\p{Emoji}\\p{Emoji_Modifier}\\p{Emoji_Component}\\p{Emoji_Modifier_Base}\\p{Emoji_Presentation}]/gu, '').charCodeAt(0)\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这似乎是截至 2022 年的最佳答案。 (4认同)

小智 11

我找到了很多建议,但解决了我的问题的正则表达式是:

/(?:[\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])/g
Run Code Online (Sandbox Code Playgroud)

一个简短的例子

function removeEmojis (string) {
  var 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]|\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])/g;
  return string.replace(regex, '');
}
Run Code Online (Sandbox Code Playgroud)

希望它可以帮到你


san*_*e89 6

@ bobince的解决方案对我不起作用.要么Emojis留在那里,要么他们被不同的表情符号交换.

这个解决方案对我有用:

var ranges = [
  '\ud83c[\udf00-\udfff]', // U+1F300 to U+1F3FF
  '\ud83d[\udc00-\ude4f]', // U+1F400 to U+1F64F
  '\ud83d[\ude80-\udeff]' // U+1F680 to U+1F6FF
];


$('#mybtn').on('click', function() {
  removeInvalidChars();
})

function removeInvalidChars() {
  var str = $('#myinput').val();

  str = str.replace(new RegExp(ranges.join('|'), 'g'), '');
  $("#myinput").val(str);
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="myinput"/>
<input type="submit" id="mybtn" value="clear"/>
Run Code Online (Sandbox Code Playgroud)

资源

  • 这个解决方案对许多角色也不起作用 (2认同)

小智 6

在搜索并尝试了很多 unicode 正则表达式之后,我建议你尝试一下这个,它可以覆盖所有表情符号

\n

\r\n
\r\n
function removeEmoji(str) {\n  let strCopy = str;\n  const emojiKeycapRegex = /[\\u0023-\\u0039]\\ufe0f?\\u20e3/g;\n  const emojiRegex = /\\p{Extended_Pictographic}/gu;\n  const emojiComponentRegex = /\\p{Emoji_Component}/gu;\n  if (emojiKeycapRegex.test(strCopy)) {\n    strCopy = strCopy.replace(emojiKeycapRegex, \'\');\n  }\n  if (emojiRegex.test(strCopy)) {\n    strCopy = strCopy.replace(emojiRegex, \'\');\n  }\n  if (emojiComponentRegex.test(strCopy)) {\n    // eslint-disable-next-line no-restricted-syntax\n    for (const emoji of (strCopy.match(emojiComponentRegex) || [])) {\n      if (/[\\d|*|#]/.test(emoji)) {\n        continue;\n      }\n      strCopy = strCopy.replace(emoji, \'\');\n    }\n  }\n\n  return strCopy;\n}\nlet a = "1\xef\xb8\x8f\xe2\x83\xa3aa\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8fb#\xef\xb8\x8f\xe2\x83\xa3\xe2\x9c\x85\xe2\x9d\x8e23#!^*bb\xe2\x80\x8d\xe2\x99\x80\xef\xb8\x8fccc";\nconsole.log(removeEmoji(a))
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

参考:Unicode Emoij 文档

\n


Eva*_*kis 5

我知道这篇文章有点旧,但我在工作中偶然发现了这个问题,一位同事提出了一个有趣的想法。基本上,而不是剥离表情符号字符只允许有效字符。咨询这个 ASCII 表:

http://www.asciitable.com/

像这样的函数只能保留合法字符(范围本身取决于您所追求的内容)

function (input) {
            var result = '';
            if (input.length == 0)
                return input;
            for (var indexOfInput = 0, lengthOfInput = input.length; indexOfInput < lengthOfInput; indexOfInput++) {
                var charAtSpecificIndex = input[indexOfInput].charCodeAt(0);
                if ((32 <= charAtSpecificIndex) && (charAtSpecificIndex <= 126)) {
                    result += input[indexOfInput];
                }
            }
            return result;
        };
Run Code Online (Sandbox Code Playgroud)

在您希望保留英文字母 + 数字 + 特殊字符的情况下,这应该保留字母表的所有数字、字母和特殊字符。希望它可以帮助某人:)