2010-01-18 43 views
5

Nó sẽ được tốt đẹp nếu ai đó có thể cho tôi một mô hình regexp cho glob để nhận bên dưới tên tập tin:giúp đỡ với glob mẫu

1.jpg // this file 
1_thumb.jpg 
2.png // this file 
2_thumb.png 
etc... 

trả lại tập tin mà không "_thumb". Tôi có mẫu này:

$numericalFiles = glob("$this->path/*_thumb.*"); 

và điều đó cho tôi tất cả với "_thumb".

Trả lời

6

glob() không phải là trường hợp xử lý các yêu cầu phức tạp nhất mà bạn đã nhận thấy rõ ràng. Tôi khuyên bạn nên sử dụng thư viện SPL của PHP và tận dụng lợi thế của lớp DirectoryIterator.

$iterator = new DirectoryIterator("/dir/path"); 
foreach ($iterator as $file) { 
    if ($file->isFile() && preg_match("/^[0-9]+\./i",$file->getFilename())) { 
     echo $file->getFilename(); 
    } 
} 

Bạn có thể sửa đổi tiêu chí của bạn sạch trong lần lặp (còn, thật dễ dàng để thay đổi iterator nếu bạn đã bao giờ cần recursive directory iteration).

+1

Nhưng nó * là * có thể 'glob()' có thể được xử lý bởi libc, do đó, bắt đầu với nó có nghĩa là bạn sẽ lặp qua ít kết quả hơn trong PHP chậm hơn nhiều. –

3

Mẫu hình cầu và cụm từ thông dụng khác nhau. Nhưng việc thực thi glob của PHP không thực hiện việc phủ định mẫu cần thiết để chỉ khớp các tệp đó. Bạn sẽ cần phải sử dụng một mẫu dương lớn hơn như [0-9]*.jpg và sau đó lọc kết quả sau đó.

3
foreach (glob('[0-9]*') as $filename) { 
    if (strpos("$filename","_thumb") === FALSE){ 
     echo "$filename \n"; 
    } 
} 
1

Hơn nữa để zombat's use của DirectoryIterator, nó cũng có ý nghĩa để xây dựng lớp lọc chuyên ngành của riêng bạn để làm cho cuộc sống dễ dàng hơn (xem sự khác biệt với các vòng foreach) và nhiều hơn nữa tái sử dụng.

class DirectoryFilterThumbs extends FilterIterator { 
    public function __construct($path) { 
     parent::__construct(new DirectoryIterator($path)); 
    } 
    public function accept() { 
     // Use regex or whatever you like here 
     return ($this->isFile() && strpos($this->getFilename(), "_thumb.") === FALSE); 
    } 
} 

$files = new DirectoryFilterThumbs("/dir/path"); 
foreach ($files as $file) { 
    echo $file->getFilename() . PHP_EOL; 
} 

Tất nhiên, nếu không cần phải làm điều này ở nhiều nơi thì trình kết hợp DirectoryIterator/điều kiện đơn giản do zombat cung cấp là hoàn toàn phù hợp.

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