我认为你也可以使用Unicode字符属性。甚至Unicode联盟提供了一个正则表达式,这个正则表达式可以相对容易地调整为ECMAScript(只需将所有出现的\x
替换为\u
并将其放在一行中)。这确实会选择可能是表情符号,这意味着它会产生误报。明确建议仍然在假定它们确实是表情符号之前验证所有匹配项。
下面是那个正则表达式的一个稍微严格一些的版本,它会返回更少的误报,并带有一个小演示:
const sentence = 'A ticket to 大阪 costs ¥2000 . Repeated emojis: . Crying cat: . Repeated emoji with skin tones: ✊✊✊✊✊✊. Flags: . Scales ⚖️⚖️⚖️.';
const regexpUnicodeModified = /\p{RI}\p{RI}|\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?(\u{200D}\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?)+|\p{EPres}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})?|\p{Emoji}(\p{EMod}+|\u{FE0F}\u{20E3}?|[\u{E0020}-\u{E007E}]+\u{E007F})/gu
console.log(sentence.match(regexpUnicodeModified));
这将记录以下内容:
> Array ["", "", "", "", "✊", "✊", "✊", "✊", "✊", "✊", "", "", "⚖️", "⚖️", "⚖️"]
这意味着它可以匹配以下内容:
- 简单的表情符号
- 带有修改器(肤色)的表情符号
- 国旗
- 地区旗帜
- 表情符号演示序列
请注意,我不知道如何将其用于用图像替换特定的表情符号,正如OP所需的那样,但这使得可以将表情符号放置在额外的标签中等。
\ud83c\udde8\ud83c\uddf3
,我不知道这是UTF-16还是十六进制或其他什么? - Mohamed Mohamed''.split('').map(function(chr) { return '\\u' + chr.charCodeAt(0).toString(16); }).join('')
- jcubic