从手册:
之后
\x,最多读取两个十六进制数字(字母可以是大写或小写).在UTF-8模式下,\x{...}允许,其中大括号的内容是一串十六进制数字.它被解释为UTF-8字符,其代码编号是给定的十六进制数.如果值大于127 ,则原始十六进制转义序列\xhh匹配两字节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
Run Code Online (Sandbox Code Playgroud)
使用花括号,当我给出代码点时,它确实匹配:
preg_match('/\\x{00E4}/u', $t); // matches
Run Code Online (Sandbox Code Playgroud)
语法是一种通过值指定字符的方法:
\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");