【问题标题】:What does \x in PHP PCRE mean?PHP PCRE 中的 \x 是什么意思?
【发布时间】:2013-09-02 13:52:59
【问题描述】:

来自the manual

\x 之后,最多读取两个十六进制数字(字母可以在 大写或小写)。在 UTF-8 模式下,\x{...} 是允许的,其中 大括号的内容是一串十六进制数字。它是 解释为 UTF-8 字符,其代码编号是给定的 十六进制数。 原始的十六进制转义序列,\xhh, 如果值大于 127,则匹配一个两字节的 UTF-8 字符。

那么这是什么意思呢?

“ä”的代码点是 E4,而 UTF-8 表示是 C3A4,但两者都不匹配:

$t = 'ä'; // same as "\xC3\xA4";

preg_match('/\\xC3A4/u', $t); // doesn't match
preg_match('/\\x00E4/u', $t); // doesn't match

当我给出代码点时,它确实匹配了花括号:

preg_match('/\\x{00E4}/u', $t); // matches

【问题讨论】:

  • 除非我遗漏了什么,否则该手册页急需重新措辞:UTF-8 是一种编码为 Unicode 字符(代码点)字节的编码,但它提到“一个 UTF-8 字符,其代码是...”和“一个两字节的 UTF-8 字符”,这两者都没有任何意义。它要么识别 Unicode 代码点,要么识别 UTF-8 字节序列;我完全不确定是哪个。

标签: php regex pcre


【解决方案1】:

语法是一种按值指定字符的方式:

  • \xAB 指定 0-FF 范围内的代码点。
  • \x{ABCD} 指定 0-FFFF 范围内的代码点。

手册中指示的措辞有点混乱,也许是为了准确。字符值 128-255(和一些)在 UTF-8 中编码为 2 字节。因此,unicode 正则表达式将匹配 7 位干净的 ASCII,但不会匹配使用所述范围内的值的不同编码/代码页(即CP437。该手册以一种迂回的方式说 unicode 正则表达式仅适用于正确编码的输入。但是;

这并不意味着\xABCD解析\x{ABCD}(一个字符)。它被解析为\xAB(一个字符)和然后CD(两个字符)1。大括号解决了这个解析歧义问题:

\x之后,最多读取两个十六进制数字..在UTF-8模式下,允许\x{...}..

其他一些语言使用\u 而不是\x 来表示较长的形式。


1 认为这匹配:

preg_match('/\xC3A4/u', "\xC3" . "A4");

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 2020-03-18
    • 2021-08-02
    • 2015-12-30
    • 2020-10-02
    • 2011-05-27
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多