preg_match:print:class匹配制表符

时间:2014-05-19 19:43:45

标签: php regex preg-match

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

  • PHP 5.5.12

3 个答案:

答案 0 :(得分:2)

这可能是一个语言环境问题,但是你必须拥有一个非常时髦的语言环境。 POSIX表示cntrl不能printspaceblank不能print,除非它是空格字符本身。在"C"区域设置中,标签是所有 cntrlspaceblank;它似乎是一个非常奇怪的语言环境,不会考虑它们。

答案 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系统似乎确实将制表符视为控制字符。我不能在这个问题上多说你,希望你活得老,还有很多孩子。