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

Trên hệ thống Windows của tôi, đầu ra cho chr(9) là:preg_match: in: lớp phù hợp với tab nhân vật

chr (9) phù hợp: in:

Với cùng mã, trên hệ thống Linux, đầu ra là:

chr (9) không khớp: in:

Tại sao chỉ có :print: kết hợp lớp học \t trên Windows?

  • PHP 5.5.12
+2

+ 1 để quan sát tốt. :) – zx81

+0

Không chắc chắn, nhưng ': print:' là ASCII '\ x20 - \ x7E' hoặc' 32 - 126' – AbraCadaver

Trả lời

2

Nó có thể là một vấn đề địa phương, nhưng sau đó bạn phải có một địa phương rất sôi nổi trên bàn tay của bạn. POSIX nói rằng không có cntrl có thể là print và không space hoặc blank có thể là print trừ khi đó là ký tự khoảng trắng. Trong tab địa phương "C", tab là tất cả của cntrl, spaceblank; nó có vẻ giống như một miền địa phương rất kỳ lạ mà sẽ xem xét nó không ai trong số đó.

2

Vấn đề lạ, vì nó không được khớp với số \t. Lớp POSIX [:print:] khớp các ký tự và không gian in. (mọi thứ ngoại trừ ký tự điều khiển)

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

Câu hỏi rất thú vị! Sau khi tìm kiếm trong doc PCRE (http://pcre.org/pcre.txt), có vẻ như rằng:

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

[: graph:] Điều này phù hợp với nhân vật mà có các ký hiệu đánh dấu trang khi in. Về tài sản Unicode, nó phù hợp với tất cả các nhân vật với L, M, N, P, S, hoặc tài sản Cf, ngoại trừ:

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

Zs Space separator

Theo những định nghĩa này, có vẻ như hệ thống Windows của bạn không thấy ký tự tab làm ký tự điều khiển. Tôi không thể nói thêm về chủ đề này và chúc bạn sống và có nhiều con.

Các vấn đề liên quan