PHP PCRE中的\ x是什么意思?

And*_*eKR 5 php regex pcre

手册:

之后\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)

use*_*674 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");