首页 > 解决方案 > 在 PHP PCRE 语法中,如何指定多码点 Unicode 字符/“表情符号”?

问题描述

代码:

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

标签: phpunicodepcreemojicodepoint

解决方案


您引用了类似\x{...]“被解释为 UTF-8 字符”的段落。措辞有点奇怪,因为它是 UTF-8 中的 Unicode 代码点而不是字符,但是由于您需要两个代码点,因此还需要两个这样的序列:

var_dump(preg_replace('#\x{1F1FB}\x{1F1F3}#u', '', 'This is the Vietnam flag: '));

推荐阅读