2010-05-18 4 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-의 솔루션은 나를 위해 좋은,하지만 :

class sfException extends Exception { } 

문서는 여기에서 찾을 수 있습니다 : 당신은 당신의 자신의 sfException 클래스를 만들 수 있습니다! 정규식없이 비슷한 솔루션이 있습니까? 또는 정규 표현식은 무엇이며, 마스크가있는 경우 /없는 경우에만 파일 이름을 검색하고 싶습니다. 예제 : stackoverflow.zip "오버플로"또는 "스택"또는 "스택 오버 플로우"를 검색하고 싶습니다 ... 대단히 고마워요! – Peter

+1

그 때문에'overflow','stack' 및'stackoverflow' 정규 표현식 만 필요합니다. 이 세 가지는 "stackoverflow.zip"과 일치합니다. 그 간단한 방법으로 정규 표현식을 사용할 수 있습니다. 특별한 의미를 갖는 문자를 이스케이프 처리 할 때주의해야합니다. – Artefacto

+0

Soo 간단! 고마워요! – 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

허용되는 대답은 정말 좋지만 바위의 Spl 반복기를 생각하게합니다. 파비앙 Potencier 그가 여기 심포니에서 찾기 클래스를 생성하는 방법을 설명 :

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

나는 그의 파인더 클래스를 사용하여, 그들은 아주 좋은 연쇄 인터페이스를 가지고있다. (SF2에서)

예 :

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 이온 다음 sf1.4 프레임 워크에서 http://symfony.com/doc/2.0/cookbook/tools/finder.html

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

이 버전은 약간 다른, 덜 공상이지만, 또한 작업을 수행합니다. sfException 클래스를 생성해야하지만 symfony 프레임 워크와의 유일한 연계 방법입니다. 답변에 대한 http://www.symfony-project.org/cookbook/1_2/en/finder