除了已经很好的,如果矛盾的答案,只是一个补充。
PCRE库的文档一直声明“范围在字符值的整理顺序中运行”。这有点模糊,但非常精确。
它指的是通过在PCRE内部字符表的字符的索引,其可被设置以匹配使用pcre_maketables
当前区域整理。该函数按照char值的顺序构建表(tolower(i)
/toupper(i)
)
换句话说,它不按实际的文化排序顺序(区域设置排序规则信息)进行排序。例如,虽然德语在词典整理中将o与o相同,但ö的值使其在德语所使用的所有常用字符编码(ISO-8859-x,unicode编码等)中出现在z范围外。在这种情况下,PCRE将根据该代码值确定ö是否在[a-z]
范围内,而不是任何实际的区域设置排序顺序。
PHP大多复制PCRE's documentation逐字在their docs。但是,他们实际上已经努力将上述语句更改为“范围在ASCII对齐序列中操作”。至少自2004年以来,这种说法一直在文档中。
尽管如此,但我不太确定它是否属实。嗯,至少在所有情况下都不是这样。
的一个调用PHP使得以pcre_maketables
...从PHP source:
#if HAVE_SETLOCALE
if (strcmp(locale, "C"))
tables = pcre_maketables();
#endif
换句话说,如果该PHP编译环境有setlocale
和的(LC_CTYPE)语言环境未POSIX/C语言环境,运行时环境的POSIX/C语言环境的字符顺序被使用。否则,默认PCRE表用于 - 其中产生(由pcre_maketables
)时PCRE编译 - 基于编译器的语言环境:
该函数建立了一组字符表的字符值小于256。可以将这些传递给pcre_compile()以覆盖PCRE的内部内置表(当编译PCRE时,由pcre_maketables()生成)。如果您使用的是非标准语言环境,则可能需要执行此操作。该函数产生一个指向表的指针。
而德国将不会在任何普通的字符编码是[a-z]
不同,如果我们处理EBCDIC,例如,[a-z]
将包括±和〜。当然,EBCDIC是我能想到的一种字符编码方式,它不会以不间断的顺序放置a-z和A-Z。
除非PCRE在使用EBCDIC(可能的话)时会有一些神奇的功能,尽管极其不可思议的是,除了最晦涩的PHP构建或运行时环境之外,您还会在其中包含变音器(使用您自己的,非常特殊的,您的可能,在EBCDIC的情况下,包括其他意想不到的字符。而对于其他范围,“按ASCII顺序整理”似乎并不完全准确。
ETA:我可以通过寻找菲利普·黑兹尔自己回答了类似的担忧已经存了一些研究:
另一个问题是与字符类范围。你会认为[a-k]和[x-z]对于拉丁脚本是很好的定义,但事实并非如此。
他们肯定明确的,等同于[\ x61- \ X6B]和[\ x78- \ X7A],也就是涉及到代码顺序,而不是文化的排序顺序。
这是真的在2009年吗? – 2014-04-02 06:18:38
@WalterTross今天仍然如此,真是如此。它从来不是关于什么是/是常见的,而是关于一些奇怪的配置会发生什么,并确保您的代码足够健壮以处理它。 – 2014-04-02 07:36:37
@AlanStorm,你能提供这么奇怪的配置吗?我很确定没有! – 2014-04-02 08:30:03