我正在调查此问题附带的another question。
我想知道为什么在早期版本中使用PHP> = 5.3.4但\p{L}
时使用false
会导致true
?
print_r(preg_match("@^\d+\s+\p{L}+\s+\d+$@", "20 Août 2014"));
\p{L}
应该按预期在PCRE 8.30到8.34中工作,因为我可以在像RegexBuddy这样的环境中进行测试:
PHP 5.4.14(PCRE 8.30)到5.6(PCRE 8.34)的结果相同(因为我找不到对PHP PCRE捆绑包进行任何自定义更改)应该实现:
根据@ user1578653 answer,使用字母Å与 0xc5 十六进制代码会有不同的输出,但是it won't(!)但是它should match。
答案 0 :(得分:3)
从v.5.3.4(http://php.net/ChangeLog-5.php)的PHP更新日志中可以看出,其中一个更改是“将捆绑的PCRE升级到版本8.10。(Ilia)”。
PCRE v8.10(http://www.pcre.org/changelog.txt)的更改日志提到了有关\ p修饰符的一些内容,特别是第12和第15点。也许这些与您的问题有关?
我做了一些测试,我认为这是造成差异的原因。 PCRE更改日志中的第15点指出:
如果使用重复的Unicode属性匹配(例如\ p {Lu} *) 非UTF-8 输入,如果带有值的字符,它可能会崩溃或给出错误的结果 主题字符串中存在大于0xc0。 (细节:假设 处理这些项目时输入UTF-8。)
如果您尝试使用小于unicode 0xc0的任何字符替换“û”字符,您将在所有版本的PHP上获得相同的结果。如果用任何等于或大于0xc0的字符替换该字符,您将获得您看到的PHP版本之间的差异。所以它必须由PCRE库的更新引起!