6

手册

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

那么这是什么意思?

“ä”的代码点是 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
4

1 回答 1

6

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

  • \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");

于 2013-08-29T23:43:51.867 回答