我想用图标替换字符串中的所有表情符号。我成功地替换了这些:{:) :D :P :3 <3 XP .... etc}
到图标,所以如果用户在字符串中写入:)
,它将被替换为图标。
但我有个问题如果用户直接粘贴等于:)
的Unicode会怎么😊样?
我需要什么:如何将Unicode图标更改为JavaScript正则表达式,例如\ud800-\udbff
。我有很多表情符号,所以我需要一个转换它们的想法,在转换它们之后,我想用正则表达式匹配它们。
示例:😁wew😁
将这些表情符号更改为\uD83D\uDE01|\uD83D\uDE4F|
。我不知道如何更改它们,所以我需要知道如何将任何表情符号更改为这些字符。
8条答案
按热度按时间lskq00tm1#
在ECMAScript 6中,您应该能够以相当简单的方式检测它。我编译了一个简单的正则表达式,它包含不同的Unicode块,即:
Regex:
Playground:play around with emoji and regex
这个答案并没有直接回答这个问题,但对如何使用Unicode块和ES6处理emoji给出了一个公平的见解。
2skhul332#
使用unicode property escapes如下:
bbmckpt73#
我认为你也可以使用Unicode字符属性。甚至Unicode Consortium自己也提供了一个正则表达式,可以相对容易地为ECMAScript调整它(通过将所有出现的
\x
替换为\u
并将其全部放在一行中)。它确实选择了 * 可能的Emoji*,这意味着它会产生误报。它明确建议在假设它们实际上是emoji之前仍然验证所有匹配。这里有一个更严格的正则表达式版本,它将返回更少的误报,并带有一个迷你演示:
这将记录以下内容:
这意味着它匹配:
请注意,我不知道如何使用这可以取代特定的表情符号与图像,因为操作需要,但它确实可以将表情符号放置在额外的标签等。
eqfvzcg84#
注意-下面的正则表达式将匹配代理对(补充)以及单个(基本)。
要查看匹配内容的十六进制版本:
如果匹配的 length 为2,则字符1是低代理项,字符2是高代理项。只需将每个字符格式化为十六进制,然后将它们连接到一个字符串中。
你可以尝试通过十六进制范围匹配一些表情符号。
这个正则表达式匹配这1,114个表情符号字符。
\p{Emoji=yes}
)。下面的正则表达式将匹配这些表情符号。
Regex
扩展
6rqinv9w5#
您可以使用以下功能更改为**\U**字符。
eiee3dmh6#
许多建议的模式与修饰符序列表情符号(肤色)或复合表情符号不匹配,或者过时并且不匹配新的表情符号,或者两者兼而有之。
考虑一下这个很酷的表情符号和匹配它的正则表达式:
这是相当的模式。这是因为它是与U+200D ZERO WIDTH JOINER一起加入的一堆其他表情符号:
👩 + U+200D + ❤️ + U+200D +💋+ U+200D +👨
所以,你希望你的模式首先匹配较长的序列,否则你会错误地匹配那些“内心表情”。
解决方案?使用像这样的模式,虽然很长,但非常简单,因为它是一个单一的交替
(?:longest|secondLongest|....|secondShortest|shortest)
:https://github.com/sweaver2112/Regex-combined-emojis/blob/master/regex.js下面是一个工作示例:
Regex 101 Demo * 匹配截至2021年5月的所有3521个表情符号 *
该演示包含 * https://unicode.org/emoji/charts/full-emoji-list.html和 * https://unicode.org/emoji/charts-13.1/full-emoji-modifiers.html中的所有字符:
zrfyljdw7#
下面是我正在使用的:
与许多其他解决方案相比非常短,它将涵盖几乎所有内容,标志,代理人,性别和肤色或其他表情符号的组合。
它的一个缺点可能是,它将涵盖不仅仅是众所周知的表情符号(但这也可以被视为一件好事,因为如果一个新的表情符号将被释放,这是一个很好的机会来涵盖它)
下面是用img标签替换unicode表情符号的用法
af7jpaap8#
这个问题真的帮助我用诺托Emoji图像替换emoji。我不想包含一个大的库,基本上是这样的:
这基本上是使用https://stackoverflow.com/a/69866962/17169707,但我插入了
\uD83C\uDFF4(\uDB40[\uDC61-\uDC7A])+\uDB40\uDC7F
来匹配细分标志,并将\u2000-\u3300
更改为\u203c-\u3300
,因为它也匹配了•
或—
。我尝试使用
\p{Emoji}
,但据我所知,如果操作系统或浏览器不知道unicode字符,这些类 * 不起作用 *。在我的情况下,我的系统不支持表情符号V15,所以它不会匹配这些表情符号。IMO,这有点违背了目的,因为我用图像替换了表情符号 * 因为 * 它们还没有在每个平台上得到支持。你可以在这里看到一个在https://unicode.org/Public/emoji/15.0/emoji-sequences.txt上工作的例子:https://jsfiddle.net/r8gef2tc/
(${m})
,以便您可以比较本地浏览器渲染和结果图像之间的输出。Emoji V15.1: 🧑🧑🧒🧒
。Emoji版本15.1在写这篇文章时只是一个草稿。诺托Emoji尚未提供此家庭emoji的图像。正则表达式并不知道这一点,它仍然试图加载图像。当失败时,图像将被其alt
文本替换,这是源emoji。如果你的系统不支持这个新的家庭表情符号,它会显示它的四个组成部分。