PHP中的不同返回值

PHP中的不同返回值,php,regex,pcre,Php,Regex,Pcre,我正在调查这件事带来的后果 我想知道为什么在早期版本中使用PHP>=5.3.4而使用true时,使用\p{L}会导致false print_r(preg_match("@^\d+\s+\p{L}+\s+\d+$@", "20 Août 2014")); 更新#1 \p{L}应该在PCRE 8.30到8.34中按预期工作,因为我可以在诸如RegexBuddy: 因此,对于PHP5.4.14(PCRE 8.30)到5.6(PCRE 8.34),同样的结果

我正在调查这件事带来的后果

我想知道为什么在早期版本中使用PHP>=5.3.4而使用
true
时,使用
\p{L}
会导致
false

print_r(preg_match("@^\d+\s+\p{L}+\s+\d+$@", "20 Août 2014"));

更新#1
\p{L}
应该在PCRE 8.30到8.34中按预期工作,因为我可以在诸如RegexBuddy:

因此,对于PHP5.4.14(PCRE 8.30)到5.6(PCRE 8.34),同样的结果(因为我找不到对PHP5.4.14(PCRE 8.30)包所做的任何自定义更改)应该可以实现:


根据@user1578653的说法,使用字母Å0xc5的十六进制代码将有不同的输出,但是(!)但是它。

从V5.3.4()的PHP变更日志来看,其中一个变化是他们“将捆绑PCRE升级到了版本8.10(Ilia)”

PCRE v8.10()的changelog提到了与\p修改器有关的几件事,特别是第12点和第15点。也许这些都与你的问题有关

更新 我做了更多的测试,我认为这是造成差异的原因。PCRE变更记录中的第15点指出:

如果使用重复的Unicode属性匹配(例如.\p{Lu}*) 非UTF-8 输入时,如果字符带有值,它可能会崩溃或给出错误的结果 主题字符串中存在大于0xc0的值。(细节:假设 处理这些项目时输入UTF-8。)


如果您尝试用任何小于unicode 0xc0的字符替换“ā”字符,您将在所有版本的PHP上获得相同的结果。如果将该字符替换为任何等于或大于0xc0的字符,则会看到PHP版本之间的差异。所以它一定是由PCRE库的更新引起的

可能是配置问题。我刚刚用PHP5.2.6、5.3.3.7和5.3.26进行了尝试。他们都返回了
false
@squemishossifrage我不这么认为。它不应该返回
0
。对于最新的PCRE引擎来说,它确实是一个正确的标记,在5.3.4中已被修复,但充其量它似乎只是一个切向关联。也许它修复了整个Unicode处理?