【问题标题】:In PHP PCRE syntax, how does one specify a multi-codepoint Unicode character/"emoji"?在 PHP PCRE 语法中,如何指定多码点 Unicode 字符/“表情符号”?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 2018-09-10
      相关资源
      最近更新 更多