【发布时间】:2021-02-28 07:26:15
【问题描述】:
代码:
var_dump(preg_replace('#\x{1F634}#u', '', 'This is the sleeping emoji: ????'));
var_dump(preg_replace('#\x{1F1FB 1F1F3}#u', '', 'This is the Vietnam flag: ????????'));
预期输出:
string(28) "This is the sleeping emoji: "
string(33) "This is the Vietnam flag: "
实际输出:
string(28) "This is the sleeping emoji: "
string(34) "This is the Vietnam flag: ???????? "
分析:
单码点表情成功移除,但未检测到多码点表情。
进行的研究:
阅读以下内容:https://www.php.net/manual/en/regexp.reference.escape.php
在“\x”之后,最多读取两个十六进制数字(字母可以是大写或小写)。在 UTF-8 模式下,允许使用 "\x{...}",其中大括号的内容是一串十六进制数字。它被解释为 UTF-8 字符,其代码编号是给定的十六进制数。如果值大于 127,则原始十六进制转义序列 \xhh 匹配两个字节的 UTF-8 字符。
很遗憾,它没有提到多码位 Unicode 字符。
问题:
如何在 PHP PCRE 语法中指定多码点表情符号/Unicode 字符?
帮助说明:
这不是一个范围!我能够检测和删除范围。这是一个单个表情符号/Unicode字符,由多个“代码点”组成。这里指定了很多:https://www.unicode.org/Public/emoji/13.1/emoji-sequences.txt
【问题讨论】:
标签: php unicode pcre emoji codepoint