2010-05-18 14 views
5

मैं खोजा गया इससे पहले कि मैं पूछता हूँ, बिना भाग्यशाली के लिए खोज ..php scandir -> फ़ाइलें/निर्देशिका

मैं खुद के लिए एक सरल स्क्रिप्ट है, जो मैं फ़ाइलें/फ़ोल्डर के लिए खोज सकते की तलाश में। PHP कोड में यह कोड स्निपेट मिला (मुझे लगता है कि मुझे इसकी आवश्यकता है), लेकिन यह मेरे लिए काम नहीं है।

"फ़ाइल/निर्देशिका एक मुखौटा का उपयोग कर के लिए खोज करने के लिए एक आसान तरीका के लिए देख रहा था। यहां इस तरह के एक समारोह है।

डिफ़ॉल्ट रूप से, इस समारोह स्मृति में scandir() परिणाम रखेंगे, scaning से बचने के लिए एक ही निर्देशिका के लिए कई बार। "

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

किसी भी मदद के लिए धन्यवाद,

पीटर

उत्तर

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

जवाब के लिए धन्यवाद, Artefacto-s समाधान मेरे लिए अच्छा है, लेकिन! रेगेक्स के बिना कोई समान समाधान है? या रेगेक्स क्या है, जब मैं केवल मास्क के साथ/बिना फाइलनामों में खोजना चाहता हूं? उदाहरण: stackoverflow.zip और मैं "ओवरफ्लो", या "स्टैक", या "स्टैक ओवरफ्लो" पर खोज करना चाहता हूं ... बहुत बहुत धन्यवाद! – Peter

+1

इसके लिए आपको केवल regexes 'overflow', 'stack' और' stackoverflow' की आवश्यकता है। वे तीन "stackoverflow.zip" से मेल खाते हैं। आप उस सरल तरीके से रेगेक्स का उपयोग कर सकते हैं, आपको केवल उन विशेषताओं से बचने के लिए सावधान रहना होगा जिनके पास विशेष अर्थ है। – Artefacto

+0

इतना आसान !! आपका बहुत बहुत धन्यवाद! – Peter

0

मैं तुम सिर्फ एक फ़ाइल के लिए खोज करना चाहते हैं, तो आप इस स्निपेट का उपयोग कर सकते हैं:

<?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

स्वीकृत उत्तर वास्तव में अच्छा है, लेकिन इसने मुझे चट्टानों पर स्प्ल इटरेटर्स के बारे में सोचा। फेबियन Potencier बताते हैं कि कैसे वह यहाँ सिम्फोनी में खोजक कक्षाओं बनाया:

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

मैं भी उसके खोजक वर्गों का उपयोग, वे एक बहुत अच्छा श्रृंखलित इंटरफ़ेस होता है।

उदाहरण:

use Symfony\Component\Finder\Finder; 

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

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

और भी ..

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

documentat आयन: http://symfony.com/doc/2.0/cookbook/tools/finder.html

sf1.4 ढांचे से PHP5.2 + संस्करण: http://svn.symfony-project.com/branches/1.4/lib/util/sfFinder.class.php

इस संस्करण में थोड़ा अलग, और कम कल्पना है, लेकिन यह भी काम करता है। हालांकि आपको एक एसएफएक्सप्शन क्लास बनाना होगा, सिम्फनी फ्रेमवर्क के साथ यह केवल एकमात्र टाई-इन है। आप अपनी खुद की sfException क्लास बना सकते हैं:

class sfException extends Exception { } 

प्रलेखन यहां पाया जा सकता: http://www.symfony-project.org/cookbook/1_2/en/finder

संबंधित मुद्दे