Я искал, прежде чем попросить, без везения ..
Я ищу простой скрипт для себя, и я могу искать файлы / папки. Нашел этот фрагмент кода в руководстве php (я думаю, мне это нужно), но это не работает для меня.
«Ищет простой способ поиска файла / каталога с использованием маски. Вот такая функция.
По умолчанию эта функция сохранит в памяти результат scandir (), чтобы избежать повторного сканирования для одного и того же каталога ».
<?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); } ?>
Спасибо за любую помощь,
Питер
$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 }
попробуйте использовать glob()
http://us2.php.net/manual/en/function.glob.php
i вы просто хотите найти файл, вы можете использовать этот фрагмент:
<?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."; } ?>
Принятый ответ действительно приятный, но это заставило меня задуматься о итераторах Spl на скалах. Фабьен Potencier объясняет, как он создал классы Finder в symfony здесь:
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');
Документация: http://symfony.com/doc/2.0/cookbook/tools/finder.html
Версия PHP5.2 + из рамы sf1.4: http://svn.symfony-project.com/branches/1.4/lib/util/sfFinder.class.php
Эта версия немного отличается и менее причудлива, но также делает работу. Вам нужно будет создать класс sfException, но это его единственная привязка к структуре symfony. Вы можете создать свой собственный класс sfException:
class sfException extends Exception { }
Документацию можно найти здесь: http://www.symfony-project.org/cookbook/1_2/en/finder