2014-05-19 16 views
7
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>"; 

W moim systemie Windows wyjście dla chr(9) jest:preg_match: print: klasa pasuje kartę charakter

chr (9) pasuje: print:

Z tego samego kodu, na systemie Linux, wyjście jest:

chr (9) robi mecz: print:

Dlaczego klasa :print: jest zgodna z \t tylko w systemie Windows?

  • PHP 5.5.12
+2

+ 1 za dobrą obserwację. :) – zx81

+0

Nie jestem pewien, ale ': print:' jest ASCII '\ x20 - \ x7E' lub' 32 - 126' – AbraCadaver

Odpowiedz

2

To może być problem locale, ale wtedy trzeba mieć bardzo ostry locale na rękach. POSIX mówi, że żaden cntrl może być print, i nie może być print, chyba że jest to sam znak spacji. W ustawieniu regionalnym "C", zakładka jest wszystkich z cntrl,; wydaje się, że jest to bardzo dziwne miejsce, które nie uważa tego za żadne z nich.

2

Dziwna sprawa, ponieważ nie powinna w ogóle pasować do \t. POSIX Class [:print:] dopasowuje drukowane znaki i spację. (Wszystko z wyjątkiem znaków sterujących)

[^\t\n\r\f\v] 
2

Bardzo ciekawe pytanie! Po poszukiwaniach w doc pcre (http://pcre.org/pcre.txt), wydaje się, że:

[:print:] This matches the same characters as [:graph:] plus space characters that are not controls, that is, characters with the Zs property.

[: graph:] pasuje to znaki, które mają glify, które oznaczają stronę po wydrukowaniu. W unikodowe względem własności, że pasuje do wszystkich znaków z L, M, N, P, S lub właściwości CF, za wyjątkiem:

   U+061C   Arabic Letter Mark 
       U+180E   Mongolian Vowel Separator 
       U+2066 - U+2069 Various "isolate"s` 

Zs Space separator

według powyższych definicji, wydaje się, że Twój system Windows widział znak tabulacji jako znak kontrolny. Nie mogę powiedzieć ci więcej na ten temat i żałuję, że nie zestarzałeś się i nie masz wielu dzieci.