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

时间:2013-08-29 23:40:01

标签: php regex pcre

来自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

1 个答案:

答案 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”);