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

Fed*_*kov 10 javascript regex unicode 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
}));
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

我真的不想强行查找我的范围内的字符序列.有人可以帮我找到用regexp做的方法.

EDITED刚想 出了一个枚举所有表情符号的想法.比野蛮力更好,但仍然在寻找更好的主意

var reg = XRegExp('\uD83D\uDE01|\uD83D\uDE4F|...','g');
Run Code Online (Sandbox Code Playgroud)

Juk*_*ela 12

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

因此需要一些间接方法.参看 到BMP之外的JavaScript字符串.

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

  • 谢谢。但这几乎是我在问题的编辑版本中遇到的问题。我真的很想避免循环,因为每次更改字符串时都会使用我的字符串。但是您让我想到了使用XRegExp('[\ uD800- \ uDBFF] [\ uDC00- \ uDFFF]','g')的想法,这对我来说已经足够了。 (2认同)

小智 6

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

从表情符号的Unicode \u1F601\u1F64F

翻译成JavaScript的UTF-16是\ud83d\ude00\ud83d\ude4f

第一个字符总是\ud83d.

因此reg退出:

/\ud83d[\ude00-\ude4f]/g
Run Code Online (Sandbox Code Playgroud)

希望这可以提供一些帮助


And*_*ler 5

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

他提出的正则表达式是:

/[\uD800-\uDFFF]./ // This matches emoji
Run Code Online (Sandbox Code Playgroud)

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

.replace(/[\uD800-\uDFFF]./g,'')
Run Code Online (Sandbox Code Playgroud)

您应该可以删除所有表情符号。

编辑:发现更好的正则表达式。上面的正则表达式缺少一些表情符号。

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

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/
Run Code Online (Sandbox Code Playgroud)

要匹配所有出现的事件,请使用g修饰符:

/[\uD83C-\uDBFF\uDC00-\uDFFF]+/g
Run Code Online (Sandbox Code Playgroud)

第二次编辑:正如CodeToad正确指出的那样?上面的正则表达式无法识别它,因为它位于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])?)*
Run Code Online (Sandbox Code Playgroud)

凯文·斯科特(Kevin Scott)很好地汇总了此正则表达式在他的博客文章中介绍的内容。剧透:它包含装饰符号


Adr*_*hia 5

    \n
  1. /\\ud83d[\\ude00-\\ude4f]/g
  2. \n
\n\n

不包括所有表情符号,例如 : ,请参阅http://getemoji.com/并尝试您的正则表达式https://regex101.com/

\n\n
    \n
  1. /[\\uD83C-\\uDBFF\\uDC00-\\uDFFF]+/g
  2. \n
\n\n

不包括所有表情符号,例如: \xe2\x9b\x91 \xe2\x98\x95\xef\xb8\x8f \xe2\x98\x81\xef\xb8\x8f\xe2\x98\x84\xef\xb8\x8f \xe2 \x98\x80\xef\xb8\x8f\xe2\x98\x83\xef\xb8\x8f \xe2\x9b\x84\xef\xb8\x8f \xe2\x9d\x84\xef\xb8\x8f \xe2\x98 \xb9\xef\xb8\x8f\xe2\x98\xba\xef\xb8\x8f\xe2\x9b\xa9\xe2\x9b\xb1\xe2\x84\xa2\xef\xb8\x8f\xc2\xa9\xef \xb8\x8f \xc2\xae\xef\xb8\x8f \xe3\x80\xb0\xef\xb8\x8f \xe2\x9e\xb0 \xe2\x9e\xbf

\n\n
    \n
  1. 即使这个正则表达式也不允许您删除所有表情符号...:
  2. \n
\n\n

https://github.com/nizaroni/emoji-strip/blob/master/dist/emoji-strip.js#L79

\n\n
\n

那么,您能说出为什么您认为这些正则表达式不能删除所有外来字符和表情符号吗?

\n
\n\n
/[\\u1000-\\uFFFF]+/g\n
Run Code Online (Sandbox Code Playgroud)\n