2010-03-26 11 views
36

Tôi muốn tất cả các file CSV trong một thư mục, vì vậy tôi sử dụngCó thể sử dụng glob() của PHP để tìm các tệp theo cách không phân biệt chữ hoa chữ thường không?

glob('my/dir/*.CSV') 

này tuy nhiên không tìm thấy các file có phần mở rộng CSV chữ thường.

tôi thể sử dụng

glob('my/dir/*.{CSV,csv}', GLOB_BRACE); 

Nhưng có một cách để cho phép tất cả các phiên bản trường hợp hỗn hợp? Hay đây chỉ là giới hạn của glob()?

+0

Chỉ cần lưu ý rằng 'glob()' thực sự không phân biệt chữ hoa trong Windows (và có thể là các hệ thống tệp không nhạy cảm khác). –

+0

Thats không đúng. 'glob (" *. CSV ")' sẽ chỉ tìm các tập tin chữ hoa, trong khi 'glob (" *. csv ")' sẽ chỉ tìm các tập tin chữ thường. --- thử nghiệm trong windows7 với php 5.3.8 – Radon8472

Trả lời

47

mẫu Glob hỗ trợ nhân vật dao động:

glob('my/dir/*.[cC][sS][vV]') 
+1

Nhưng nó cũng sẽ không khớp với bất kỳ tệp nào kết thúc bằng ".Csv" hoặc ".CsV"? Nhưng đó là một sidepoint: những gì tôi đang tìm kiếm là một mẫu phù hợp với tất cả các tệp hình ảnh theo cách không phân biệt chữ hoa chữ thường (jpg, JPG, png, PNG, v.v.). – JohnK

+3

@JohnK: "Nhưng có cách nào để cho phép tất cả các phiên bản hỗn hợp không?" –

27

Bạn có thể làm điều này

$files = glob('my/dir/*'); 

$csvFiles = preg_grep('/\.csv$/i', $files); 
+0

Rất sạch sẽ và linh hoạt. – concept

+2

Đồng ý. Có vẻ như bạn không thể kết hợp GLOB_BRACE với phạm vi ký tự, vì vậy tôi đã sử dụng glob + preg_grep để thực hiện tìm kiếm không phân biệt dạng chữ của nhiều định dạng tệp cùng một lúc. Cảm ơn vì tiền hỗ trợ! –

+0

Đây là giải pháp hữu ích nhất. – Jonathan

5

glob('my/dir/*.[cC][sS][vV]') nên làm điều đó. Vâng, đó là loại xấu xí.

0

Bạn có thể viết cụm từ không phân biệt chữ hoa chữ thường của riêng bạn. Đây là từ một thư viện web cá nhân tôi viết:

/** PHP has no case insensitive globbing 
* so we have to build our own. 
* 
* $base will be the initial part of the path which doesn't need case insensitive 
* globbing. 
* Suffix is similar - it will not be made insensitive 
* Make good use of $base and $suffix to keep $pat simple and fast in use. 
*/ 
    function ciGlob($pat, $base = '', $suffix = '') 
    { 
     $p = $base; 
     for($x=0; $x<strlen($pat); $x++) 
     { 
      $c = substr($pat, $x, 1); 
      if(preg_match("/[^A-Za-z]/", $c)) 
      { 
       $p .= $c; 
       continue; 
      } 
      $a = strtolower($c); 
      $b = strtoupper($c); 
      $p .= "[{$a}{$b}]"; 
     } 
     $p .= $suffix; 
     return glob($p); 
    } 
2

Bạn cũng có thể lọc ra các tập tin sau khi chọn tất cả trong số họ

foreach(glob('my/dir/*') as $file){ 
    $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); 
    if(!in_array($ext, array('csv'))){ 
     continue; 
    } 
    ... do stuff ... 
} 

hiệu suất khôn ngoan này có thể không phải là lựa chọn tốt nhất nếu ví dụ bạn có 1 triệu tệp không phải là csv trong thư mục.

0

Tôi nghe nói về một chức năng có thể được sử dụng như thế này: Hãy thử nếu điều đó phù hợp với bạn!

<?php 
$pattern = sql_regcase("*.txt"); 
glob($pattern); 
?> 
+0

Thú vị. Việc sử dụng nó đã bị phản đối. – alex

-1

Để làm cho nó làm việc với tất cả các phần mở rộng sử dụng:

$extension = 'some_extension'; 
glob('my/dir/*.preg_replace('/(\w)/e', "'['.strtoupper($1).strtolower($1).']'", $extension)); 
+0

Tại sao lại là downvote? –

+1

Tôi không thể nói cho bất cứ ai xuống bầu bạn, nhưng một vài (hy vọng hữu ích) điểm: (1) chuỗi đường dẫn của bạn là thiếu '' ', và (2) cờ PCRE' e' (eval) không được chấp nhận như của PHP 5.5 và bị loại bỏ trong 7, cả hai đều cũ hơn câu trả lời này. Việc sử dụng nó không được khuyến khích. – cautionbug

+0

'preg_replace()' được sử dụng không cần thiết. Bạn có thể 'explode()', 'map()', trả về các biến thể case và sau đó là 'join()'. – alex

0

Came để liên kết này cho glob với nhiều file. Mặc dù nó không giúp với OP, nó có thể giúp những người khác kết thúc ở đây.

$file_type = 'csv,jpeg,gif,png,jpg'; 
$i = '0'; 
foreach(explode(",",$file_type) as $row){ 
    if ($i == '0') { 
     $file_types = $row.','.strtoupper($row); 
    } else { 
     $file_types .= ','.$row.','.strtoupper($row); 
    } 
    $i++; 
} 

$files = glob($dir."*.{".$image_types."}",GLOB_BRACE); 
+0

'$ i' là' '0''? Tại sao? – alex

+0

0 là phần tử đầu tiên trong mảng – user3058870

+0

Ý tôi là, bạn đang sử dụng nó làm chỉ mục vòng lặp, nhưng xác định nó như một chuỗi. – alex

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