Для поиска файлов на сервере хорошо подходит функция glob(), которая возвращает список файлов по заданной маске, например:
В маске можно использовать следующие специальные символы:
* |
Соответствует нулю или большему количеству любых символов. |
? |
Один любой символ. |
[...] |
Один символ входящий в группу. |
[!...] |
Один символ не входящий в группу. |
{...,...} |
Вхождение подстрок, работает с флагом GLOB_BRACE . |
\ |
Экранирует следующий символ, кроме случаев, когда используется флаг GLOB_NOESCAPE . |
Доступные флаги:
GLOB_MARK |
Добавляет слеш к каждой возвращаемой директории. |
GLOB_NOSORT |
Возвращает файлы в том виде, в котором они содержатся в директории (без сортировки). Если этот флаг не указан, то имена сортируются по алфавиту. |
GLOB_NOCHECK |
Возвращает шаблон поиска, если с его помощью не был найден ни один файл. |
GLOB_NOESCAPE |
Обратные слеши не экранируют метасимволы. |
GLOB_BRACE |
Раскрывает {a,b,c} для совпадения с «a », «b » или «c ». |
GLOB_ONLYDIR |
Возвращает только директории, совпадающие с шаблоном. |
GLOB_ERR |
Останавливается при ошибках чтения (например, директории без права чтения), по умолчанию ошибки игнорируются. |
Возможно использовать несколько флагов:
Далее во всех примерах используется папка tmp со следующим содержимым:
Список всех файлов и директорий
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/*') as $file) {
$files[] = basename($file);
}
print_r($files);
Результат:
Array
(
[0] => 1.svg
[1] => 2.jpg
[2] => 22-f.gif
[3] => 22.svg
[4] => img.png
[5] => path
[6] => prod.png
[7] => style-1.txt
[8] => style-2.css
)
Только файлы
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/*') as $file) {
if (is_file($file)) {
$files[] = basename($file);
}
}
print_r($files);
Результат:
Array
(
[0] => 1.svg
[1] => 2.jpg
[2] => 22-f.gif
[3] => 22.svg
[4] => img.png
[5] => prod.png
[6] => style-1.txt
[7] => style-2.css
)
Только директории
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/*') as $file) {
if (is_dir($file)) {
$files[] = basename($file);
}
}
print_r($files);
Результат:
Array
(
[0] => path
)
Поиск по расширению
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/*.svg') as $file) {
$files[] = basename($file);
}
print_r($files);
Результат:
Array
(
[0] => 1.svg
[1] => 22.svg
)
Поиск по нескольким расширениям
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/*.{jpg,png}', GLOB_BRACE) as $file) {
$files[] = basename($file);
}
print_r($files);
Результат:
Array
(
[0] => 2.jpg
[1] => img.png
[2] => prod.png
)
Поиск по имени файла
Например, в названия файлов начинаются со слова «style»:
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/style*.*') as $file) {
$files[] = basename($file);
}
print_r($files);
Результат:
Array
(
[0] => style-1.txt
[1] => style-2.css
)
Или начинаются с цифр:
$dir = __DIR__ . '/tmp';
$files = array();
foreach(glob($dir . '/[0-9]*.*', GLOB_BRACE) as $obj) {
$files[] = basename($obj);
}
print_r($files);
Результат:
Array
(
[0] => 1.svg
[1] => 2.jpg
[2] => 22-f.gif
[3] => 22.svg
)
Поиск по всем подкатегориям более сложный т.к. требует применение рекурсии.
Список всех файлов
function glob_tree_files($path, $_base_path = null)
{
if (is_null($_base_path)) {
$_base_path = '';
} else {
$_base_path .= basename($path) . '/';
}
$out = array();
foreach(glob($path . '/*') as $file) {
if (is_dir($file)) {
$out = array_merge($out, glob_tree_files($file, $_base_path));
} else {
$out[] = $_base_path . basename($file);
}
}
return $out;
}
$dir = __DIR__ . '/tmp';
$files = glob_tree_files($dir);
print_r($files);
Результат:
Array
(
[0] => 1.svg
[1] => 2.jpg
[2] => 22-f.gif
[3] => 22.svg
[4] => img.png
[5] => path/icon-rew.png
[6] => path/marker.png
[7] => path/psd/1.psd
[8] => path/psd/2.psd
[9] => path/psd/index.psd
[10] => path/sh-1.png
[11] => path/title-1.png
[12] => prod.png
[13] => style-1.txt
[14] => style-2.css
)
Список всех директорий
function glob_tree_dirs($path, $_base_path = null)
{
if (is_null($_base_path)) {
$_base_path = '';
} else {
$_base_path .= basename($path) . '/';
}
$out = array();
foreach(glob($path . '/*', GLOB_ONLYDIR) as $file) {
if (is_dir($file)) {
$out[] = $_base_path . basename($file);
$out = array_merge($out, glob_tree_dirs($file, $_base_path));
}
}
return $out;
}
$dir = __DIR__ . '/tmp';
$files = glob_tree_dirs($dir);
print_r($files);
Результат:
Array
(
[0] => path
[1] => path/psd
)
Поиск по имени/расширению
function glob_tree_search($path, $pattern, $_base_path = null)
{
if (is_null($_base_path)) {
$_base_path = '';
} else {
$_base_path .= basename($path) . '/';
}
$out = array();
foreach(glob($path . '/' . $pattern, GLOB_BRACE) as $file) {
$out[] = $_base_path . basename($file);
}
foreach(glob($path . '/*', GLOB_ONLYDIR) as $file) {
$out = array_merge($out, glob_tree_search($file, $pattern, $_base_path));
}
return $out;
}
$path = __DIR__ . '/tmp';
$files = glob_tree_search($path, '*.{jpg,png}');
print_r($files);
Результат:
Array
(
[0] => 2.jpg
[1] => img.png
[2] => prod.png
[3] => path/icon-rew.png
[4] => path/marker.png
[5] => path/sh-1.png
[6] => path/title-1.png
)
Чтобы в результирующих списках выводились полные пути к файлам, достаточно удалить функцию basename()
.