glob desen ile yardımcı

3 Cevap php

Birisi bana dosya aşağıda almak için glob için bir sıradanifade desen verebilir eğer güzel olurdu:

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

"_thumb" olmadan dosyaları geri. Ben bu modeli var:

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

ve bununla bana bütün ver "_thumb."

3 Cevap

Açıkça fark ettik glob(), dosya eşleştirme için karmaşık gereksinimleri vardır tutuş durumlarında da büyük değil. PHP'nin SPL kütüphaneyi kullanarak ve DirectoryIterator sınıfının yararlanarak tavsiye ederim.

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

Sen yineleme sırasında temiz kriterlerinizi değiştirebilirsiniz (Hiç gerekirse de, bu yineleyici değiştirmek kolaydır recursive directory iteration).

Glob desen ve düzenli ifadeler farklı. Ama PHP'nin glob uygulama sadece bu eşleşen dosyaları için gerekli desen olumsuzlamayı uygulamıyor. Bu tür [0-9]*.jpg olarak büyük bir pozitif deseni kullanmak ve daha sonra daha sonra sonuçlarını süzmek gerekir.

Dahası zombat's use DirectoryIterator of, aynı zamanda hayatı kolaylaştırmak için kendi özel filtre sınıfını inşa etmek mantıklı olabilir (foreach döngüler ile farkı görmek) ve daha yeniden.

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;
}

Birden fazla yerde bunu yapmak için hiçbir ihtiyaç varsa tabii, sonra zombat tarafından verilen düz DirectoryIterator / durumu combo gayet uygundur.