for($i = 0; $i < 255; $i++)
if (preg_match('@[[:print:]]@', chr($i))) echo "chr($i) matches :print:<br>"; else echo "chr($i) doesnt match :print:<br>";
在我的Windows系统上,chr(9)
的输出为:
chr(9)匹配:print:
使用相同的代码,在Linux系统上,输出为:
chr(9)不匹配:print:
为什么:print:
类仅在Windows上匹配\t
?
答案 0 :(得分:2)
这可能是一个语言环境问题,但是你必须拥有一个非常时髦的语言环境。 POSIX表示cntrl
不能print
,space
或blank
不能print
,除非它是空格字符本身。在"C"
区域设置中,标签是所有 cntrl
,space
和blank
;它似乎是一个非常奇怪的语言环境,不会考虑它们。
答案 1 :(得分:2)
奇怪的问题,因为它根本不匹配\t
。 POSIX类[:print:]
匹配打印的字符和空格。 (除了控制字符之外的任何东西)
[^\t\n\r\f\v]
答案 2 :(得分:2)
非常有趣的问题!在pcre文档(http://pcre.org/pcre.txt)中搜索后,似乎:
[:print:] This matches the same characters as [:graph:] plus space characters that are not controls, that is, characters with the Zs property.
[:graph:]匹配具有标记页面的字形的字符 打印时在Unicode属性术语中,它匹配具有L,M,N,P,S或Cf属性的所有字符,但以下情况除外:
U+061C Arabic Letter Mark U+180E Mongolian Vowel Separator U+2066 - U+2069 Various "isolate"s`
Zs Space separator
根据这些定义,您的Windows系统似乎确实将制表符视为控制字符。我不能在这个问题上多说你,希望你活得老,还有很多孩子。