PHP中的不同返回值
我正在调查这件事带来的后果 我想知道为什么在早期版本中使用PHP>=5.3.4而使用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),同样的结果
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处理?