来自the manual:
在
\x
之后,最多读取两个十六进制数字(字母可以在 大写或小写)。在UTF-8模式下,允许\x{...}
,其中。{1}} 大括号的内容是一串十六进制数字。它是 解释为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
答案 0 :(得分:5)
语法是一种按值指定字符的方法:
\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”);