2010-05-18 20 views
5

dosyaları/dizinleri için arama ..php scandir -> Ben şanslı olmadan ben sormadan aradı

ben dosya/klasörler için arama yapabilirsiniz kendim için basit bir komut dosyası, arayan. Bu kod snippetini php kılavuzunda buldum (buna ihtiyacım var), ama benim için işe yaramıyor.

"Buraya. Maske kullanarak bir dosya/dizini aramak için basit bir yol arıyoruz böyle bir fonksiyonudur oldu. Varsayılan olarak

bu işlev, bellekte scandir() sonucu tutacak scaning önlemek için Aynı dizin için çoklu zaman. "

<?php 
function sdir($path='.', $mask='*', $nocache=0){ 
    static $dir = array(); // cache result in memory 
    if (!isset($dir[$path]) || $nocache) { 
     $dir[$path] = scandir($path); 
    } 
    foreach ($dir[$path] as $i=>$entry) { 
     if ($entry!='.' && $entry!='..' && fnmatch($mask, $entry)) { 
      $sdir[] = $entry; 
     } 
    } 
    return ($sdir); 
} 
?> 

, herhangi bir yardım için

Peter teşekkür ederiz

cevap

3
$a = new RegexIterator(
    new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator('DIRECTORY HERE') 
    ), 
    '/REGEX HERE/', 
    RegexIterator::MATCH 
); 

foreach ($a as $v) { 
    echo "$v\n"; //$v will be the filename 
} 
+0

teşekkürler, artefacto-s çözüm benim için iyidir, ama:

class sfException extends Exception { } 

Belgeler burada bulunabilir: Kendi sfException Class yaratabilir! Regex olmadan benzer bir çözüm var mı? Ya da maskeleri olan/olmayan dosya isimlerini sadece aramak istediğimde regex nedir? örnek: stackoverflow.zip ve "overflow" veya "stack" veya "stackoverflow" üzerinde arama yapmak istiyorum ... Çok teşekkür ederim! – Peter

+1

Bunun için “taşma”, “yığın” ve “yığın akış” ifadelerine ihtiyacınız vardır. Bu üç "stackoverflow.zip" ile eşleşir. Düzenli ifadeleri bu basit şekilde kullanabilirsiniz, sadece özel anlamı olan karakterlerden kaçmak için dikkatli olmanız gerekir. – Artefacto

+0

Soo basit! Çok teşekkür ederim! – Peter

0

i sadece bir dosyayı aramak istiyorum, bu pasajı kullanabilirsiniz:

<?php 
    $s = $get['s']; 
    $e = ".htm"; 
    $folders = array("data1", "data2", "data3"); 
    $files = array(); // nothing needed here. anything in this array will be showed as a search result. 
    for($i=0;$i<=count($folders)-1;$i++) { 
     $glob = glob($folders[$i]); 
     $files = array_merge($files, $glob[$i]); 
    } 
    echo "Search - $s<br><br>"; 
    if(count($files) == 1) { 
     echo "<li><a href='$files[0]'>".heir($files[0])."</a></li>"; 
    } 
    if(count($files) != 1) { 
     for($i=0;$i<=count($files)-1;$i++) { 
      echo "<li><a href='$files[$i]'>".heir($files[$i])."</a></li>"; 
     } 
    } 
    if(count($files) == 0) { 
     echo "Sorry, no hits."; 
    } 
?> 
0

Kabul edilen cevap gerçekten çok güzel, ama beni kayaların üzerindeki Spl yineleyicileri düşünmeye itti. Fabien Potencier burada symfony Finder sınıfları oluşturulmuş açıklar:

http://fabien.potencier.org/article/43/find-your-files

Ben de onun bulucu sınıflarını kullanmak, bunlar çok güzel zincirleme bir arayüze sahiptir. (SF2 kaynaktan)

Örnek:

use Symfony\Component\Finder\Finder; 

$finder = new Finder(); 
$finder->files()->in(__DIR__); 

foreach ($finder as $file) { 
    print $file->getRealpath()."\n"; 
} 

ve ..

$finder->files()->name('*.php'); 
// or 
$finder->files()->size('>= 1K')->size('<= 2K'); 
$finder->date('since yesterday'); 

documentat iyon: sf1.4 çerçevesinden http://symfony.com/doc/2.0/cookbook/tools/finder.html

PHP5.2 + versiyonu: http://svn.symfony-project.com/branches/1.4/lib/util/sfFinder.class.php

Bu sürüm biraz farklı ve daha az fantezi değil, aynı zamanda iş yok. Yine de bir sfException sınıfı oluşturmanız gerekecek, bunun yalnızca symfony çerçevesine sahip olması. Cevaplar için http://www.symfony-project.org/cookbook/1_2/en/finder