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

Auf meinem Windows-System, wird der Ausgang für chr(9) ist:preg_match: Druck: Klasse passt Tabulatorzeichen

chr (9) übereinstimmt: print:

mit dem gleichen Code, auf einem Linux-System ist der Ausgang:

chr (9) doesnt match: Druck:

Warum passt die Klasse :print:\t nur unter Windows?

  • PHP 5.5.12
+2

+ 1 für nette Beobachtung. :) – zx81

+0

Nicht sicher, aber ': print:' ist ASCII '\ x20 - \ x7E' oder' 32-126' – AbraCadaver

Antwort

2

Es könnte ein locale Problem sein, aber dann müssen Sie eine sehr funky locale haben auf Ihre Hände. POSIX sagt, dass kein cntrlprint sein kann, und kein space oder blank kann print sein, es sei denn, es ist das Leerzeichen selbst. In dem Gebietsschema "C" ist die Registerkarte alle von cntrl, space und blank; es scheint, als wäre es ein sehr merkwürdiger Ort, der es nicht als solches ansehen würde.

2

Seltsames Problem, weil es \t überhaupt nicht übereinstimmen sollte. Die POSIX-Klasse [:print:] entspricht gedruckten Zeichen und Leerzeichen. (Alles außer Steuerzeichen)

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

Sehr interessante Frage! Nachdem er in der pcre doc Suche (http://pcre.org/pcre.txt), scheint es, dass:

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

[: graph:] Dieses Zeichen entspricht, die Glyphen, die die Seite beim Drucken markieren. In Unicode-Eigenschaft Bedingungen paßt er alle Zeichen mit dem L, M, N, P, S, oder Eigenschaften Cf, ausgenommen:

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

Zs Space separator

Nach diesen Definitionen, es scheint, dass Ihr Windows-System sieht das Tab-Zeichen als Steuerzeichen. Ich kann Ihnen zu diesem Thema nicht mehr sagen und wünsche Ihnen, alt zu leben und viele Kinder zu haben.