php - 在 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
解决方案
您引用了类似\x{...]
“被解释为 UTF-8 字符”的段落。措辞有点奇怪,因为它是 UTF-8 中的 Unicode 代码点而不是字符,但是由于您需要两个代码点,因此还需要两个这样的序列:
var_dump(preg_replace('#\x{1F1FB}\x{1F1F3}#u', '', 'This is the Vietnam flag: '));
推荐阅读
- python - “只有整数标量数组可以转换为标量索引”
- python - 在 django rest 框架中使用 simple_jwt 在一段时间不活动后注销用户
- line - 当价格在 pine 脚本中中断时如何删除一行?
- java - 更改实例方法的返回值
- ios - Xcode 在 ARM MacBook 上编译时出现 Cocoapod 框架错误
- javascript - React Native Cant Find Variable 简单错误
- java - 将 ArrayLists 用于一组类的更有效方法?
- azure-devops - 识别一些在 azure devops 中触发我的 yaml 的提交变量构建并将图像推送到容器注册表
- python - 使用基于标头的python从文件中删除重复内容
- python - 在 python 中使用 Flask JWT 进行身份验证