在javascript中使用regexp替换表情符号unicode符号

时间:2014-02-25 06:21:50

标签: javascript regex unicode emoji

众所周知,emoji符号最多编码为3或4个字节,因此它可能会占用我的字符串中的2个符号。例如'wew'.length = 7 我想在我的文本中找到这些符号,并将它们替换为依赖于其代码的值。 读SO,我带着unicode插件来到XRegExp库,但还没找到如何让它工作的方法。

var str = 'wew';// \u1F601 symbol
var reg = XRegExp('[\u1F601-\u1F64F]', 'g'); //  /[ὠ1-ὤF]/g -doesn't make a lot of sense  
//var reg = XRegExp('[\uD83D\uDE01-\uD83D\uDE4F]', 'g'); //Range out of order in character class
//var reg = XRegExp('\\p{L}', 'g'); //doesn't match my symbols
console.log(XRegExp.replace(str, reg, function(match){
   return encodeURIComponent(match);// here I want to have smth like that %F0%9F%98%84 to be able to map anything I want to this value and replace to it
}));

jsfiddle

我真的不想强行查找字符串中的字符序列。有人可以帮我找到用regexp做的方法。

EDITED 刚想出了枚举所有表情符号的想法。比brutforce好,但仍然在寻找更好的主意

var reg = XRegExp('\uD83D\uDE01|\uD83D\uDE4F|...','g');

9 个答案:

答案 0 :(得分:12)

\u....表示法有四个十六进制数字,不能少,不多,所以它只能代表U + FFFF的代码点。上面的Unicode字符表示为代理代码点对。

因此需要一些间接方法。参看到JavaScript strings outside of the BMP

例如,您可以查找范围[\uD800-\uDBFF](高代理项)中的代码点,当找到代码点时,检查字符串中的下一个代码点是否在[\uDC00-\uDFFF]范围内(如果没有,则存在严重的数据错误),将两者解释为Unicode字符,并将其替换为您希望放在那里的任何内容。这看起来像是一个通过字符串的简单循环的工作,而不是正则表达式。

答案 1 :(得分:6)

也许你可以看一下这篇文章:http://crocodillon.com/blog/parsing-emoji-unicode-in-javascript

\u1F601\u1F64F

的表情符号unicode

翻译为javascript,utf-16为\ud83d\ude00\ud83d\ude4f

第一个字符始终为\ud83d

所以reg退出了:

/\ud83d[\ude00-\ude4f]/g

希望这可以提供一些帮助

答案 2 :(得分:5)

这有些陈旧,但我正在研究这个问题看来Bradley Momberger在这里发布了一个很好的解决方案:http://airhadoken.github.io/2015/04/22/javascript-string-handling-emoji.html

他提出的正则表达式是:

/[\uD800-\uDFFF]./ // This matches emoji

这个正则表达式与emojis使用的头部代理人和头部代理人(假定为尾部代理人)之后的字符匹配。因此,所有表情符号都应正确匹配并与

匹配
.replace(/[\uD800-\uDFFF]./g,'')

你应该能够删除所有的表情符号。

编辑:找到更好的正则表达式。上面的正则表达式错过了一些表情符号。

但是有一个带有版本的reddit帖子,我找不到表情符号,除了规则。 reddit在这里: https://www.reddit.com/r/tasker/comments/4vhf2f/how_to_regex_emojis_in_tasker_for_search_match_or/ 正则表达式是:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/

要匹配所有出现次数,请使用g修饰符:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/g

<击>

第二次编辑:正如CodeToad正确指出的那样,上面的Regex无法识别✨,因为它位于dingbats块中(感谢air_hadoken)。

lodash库提供了一个出色的Emoji Regex块:

(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?(?:\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0]|\ud83c[\udffb-\udfff])?)*
凯文·斯科特很好地把这个正则表达式包含在他的Blog Post中。剧透:它包括dingbats

答案 3 :(得分:1)

  1. / \ ud83d [\ ude00- \ ude4f] /克
  2. 不包括所有表情符号:,请参阅http://getemoji.com/并尝试使用正则表达式https://regex101.com/

    1. / [\ uD83C- \ uDBFF \ uDC00- \ uDFFF] + / g
    2. 不包括所有表情符号:⛑⛑️☁️☄️☀️☃️⛄️❄️☹️☺️⛩⛱™️©️®️〰️➰➰

      1. 即使这个正则表达式也不允许你删除所有表情符号......:
      2. https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79

          

        然后,你能说出为什么你认为这些正则表达式对于删除所有奇异的角色和表情符号是不好的吗?

        /[\u1000-\uFFFF]+/g
        

答案 4 :(得分:0)

以下正则表达式在java中为我工作。

"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"

由于java String使用UTF-16编码,并且表情符号也高于0xFFFF,因此此正则表达式模式考虑使用代理对来识别表情符号。

答案 5 :(得分:0)

删除所有可能的表情符号:

new RegExp('[\u1000-\uFFFF]+', 'g');

答案 6 :(得分:0)

为了娱乐:无需使用regexp即可删除特殊字符的解决方案

const str = "abcdefgehijkz Раз, два три! 1234567809 -ab A Z & é è Ö â ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ☺️ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ☹️ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-axxb-"


/********* with regExp ***********/
let startTime = new Date().getTime();
let resp = str.replace(new RegExp('[\u00FF-\uFFFF]+','g'), '');
console.log(resp);
console.log(new Date().getTime() - startTime);


/********* without regExp ***********/
startTime = new Date().getTime();
resp = Array.from(str, x => {
  let theUnicode = x.charCodeAt(0).toString(16);
  while (theUnicode.length < 4) {
    theUnicode = '0' + theUnicode;
  }
  if (theUnicode < '00ff') { 
    return x;
  }
}).join('');
console.log(resp);
console.log(new Date().getTime() - startTime);

答案 7 :(得分:-2)

可能你应该以这种方式使用替换?

reg = str.replace(new RegExp('','g'),'');

试用https://github.com/iLeonidze/emoji.js

答案 8 :(得分:-3)

表情符号在U + 1F600到U + 1F64F范围内

您可以在脚本中使用此行与Json一起发送:

text.replace(/[\u1F60-\u1F64]|[\u2702-\u27B0]|[\u1F68-\u1F6C]|[\u1F30-\u1F70]{\u2600-\u26ff]/g, "");