2016-01-12 2 views
2

Я написал следующую функцию для рекурсивного поиска всех файлов, не начиная с ~. Но это не сработает. На самом деле это только кажется, чтобы найти те, которые начинаются с ~Не могу получить glob, чтобы найти все файлы, не начиная с ~

function rfl($dir) { 
    $search=$dir."[^~]*"; 
    echo "searching for: $search<br/>"; 
    $search=glob($search); //find every file and directory not starting with ~. directories are returned with/afterwards 
    $list=array(); 
    foreach ($search as $file) { 
     if (is_dir($file)) { 
      $list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories 
      echo 'D: ' . $file.'<br/>'; 
     } else { 
      $list[]=$file;       //add files to list 
      echo 'F: ' . $file.'<br/>'; 
     } 
    } 
    return $list; 
} 
print_r(rfl('code/')); 

возвращается

searching for: code/[^~]* 
searching for: code/~private/[^~]* 
D: code/~private 
Array () 

Вот фиксированная функция, используя ответ Клейтона:

function rfl($dir) { 
    $search = preg_grep('!^'.$dir.'[^~]!', glob($dir.'*')); //find every file and directory not starting with ~. directories are returned with/afterwards 
    $list=array(); 
    foreach ($search as $file) { 
     if (is_dir($file)) { 
      $list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories 
     } else { 
      $list[]=$file;       //add files to list 
     } 
    } 
    return $list; 
} 
+0

да Я знаю, как принимать ответы. Спасибо за помощь. Я отредактировал свой вопрос, чтобы показать фиксированную функцию в случае, если кому-то понадобится. –

ответ

1

glob, кажется, не очень разрешить отрицание, несмотря на то, что один из комментариев говорит о документации PHP glob.

Вместо этого я предлагаю следующее в качестве альтернативы:

$path = '../Sites/'; 
$results = preg_grep('!^'.preg_quote($path).'[^~]!', glob($path.'*')); 
print_r($results); 

preg_grep будет фильтровать массив, чтобы только результаты, которые не начинаются с тильды. Поскольку glob возвращает полный путь, нам нужно уйти и включить путь в шаблон регулярного выражения.

Подробнее здесь: http://php.net/preg_grep

preg_grep - Возвращает массив вхождений, которые соответствуют шаблону

Использование: массив preg_grep (строка $ шаблон, массив $ вход [, Int $ флаги = 0 ])

Вот ваш код обновлен, чтобы включить изменения:

function rfl($dir) { 
    $search=$dir."[^~]*"; 
    echo "searching for: $search<br/>"; 

    $search= preg_grep('!^'.preg_quote($dir).'[^~]!', glob($dir.'*')); //find every file and directory not starting with ~. directories are returned with/afterwards 
    $list=array(); 
    foreach ($search as $file) { 
     if (is_dir($file)) { 
      $list=array_merge($list,rfl($file.'/')); //recursively search for valid files in directories 
      echo 'D: ' . $file.'<br/>'; 
     } else { 
      $list[]=$file;       //add files to list 
      echo 'F: ' . $file.'<br/>'; 
     } 
    } 
    return $list; 
} 
print_r(rfl('code/'));