PCRE无法针对X转义序列匹配某些UTF-8字符


PCRE cannot match Certain UTF-8 characters against X escape sequence

我正在对UTF-8和PCRE进行一些测试,发现以下regex不能匹配某些字符,例如E1 8D 9F(字符)。

return preg_match_all( '/'X/u' , $string , $matches , PREG_SET_ORDER );

$string恰好是一个UTF-8字符。工作与许多字符,但我有一个代码点的列表,失败的这个正则表达式。有线索吗?

编辑:当我逐个字节检查它们时,上面regex失败的所有字符都是完全有效的。这是臭虫还是什么?

这可能是您的PHP版本中的错误-它在PHP 5.4中工作正常,但并非所有以前的版本。这里有一个在线代码示例,说明它适用于哪些情况。

顺便说一句,这个答案是基于假设你的意思是字符U+135F,它具有utf-8编码0xE1 0x8D 0x9F。

http://www.fileformat.info/info/unicode/char/135F/index.htm

PHP文档说'X相当于(?>'PM'pM*)。我认为U+135F和这个不匹配。见http://php.net/manual/en/regexp.reference.unicode.php

从PCRE 8.32开始,'X匹配Unicode对扩展字形簇的定义。见http://bugs.exim.org/show_bug.cgi?id=1279

PHP5.4.14包含PCRE 8.32。