Подтвердить что ты не робот

Найти все файлы в каталоге со строкой или шаблоном в имени файла с помощью PHP

Я пытаюсь перечислить файлы в директории (рекурсивной или не) с PHP, где filename соответствует определенному шаблону. Я никогда не был слишком хорош в regex, поэтому любая помощь, которую вы могли бы предложить, была бы замечательной. Я мог бы искать буквальную проверку возвращенных имен файлов, но я думаю, что не такая замечательная идея:)

Обновление + Окончательное решение: 1/18/2011 @8:06 PM

Я нашел другой способ сделать то, что искал, как только я понял регулярное выражение еще немного. Конечно, я был полностью расстроен тем, где я был с регулярным выражением, теперь я получаю немного от этого, благодаря тому, что друг отталкивает меня в сторону, чтобы объяснить некоторые из них в более простых выражениях, чем я находил в онлайн-руководствах.

Это решение в основном проверяет конкретные изображения с префиксом "prefixone" или "prefixtwo", а также проверяет, что это изображение определенного типа (jpg, jpeg, png) и соответствует любому из следующие форматы.

В зависимости от пули, которую вы передали из Wordpress (где я это использовал), она соответствовала бы этому регулярному выражению. Вот пример:

prefixone.123-abc._tag1.001.jpg
prefixone.345-xyz._tag1.002.jpeg
prefixtwo.123-abc._tag2._tag1.003.jpg
prefixone.123-abc._tag2.004.jpeg
prefixtwo.345-xyz._tag2._tag3._tag1.005.jpg
prefixtwo.123-abc._tag1.001.jpg
prefixone.345-xyz._tag1.001.png
prefixtwo.456-rst._tag1.001.png

Все эти файлы, которые потенциально могут быть возвращены в список файлов из нашей функции opendir(), могут быть совпадающими, если совпадение совпадений. Независимо от упорядочивания информации тегов в имени файла.

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

код:

<?php
// create an array to hold directory list
$results = array();

// create a handler for the directory
$directory = $_SERVER['DOCUMENT_ROOT'].'/some/path/to/images/';
$handler = opendir($directory);

// open directory and walk through the filenames
while ($file = readdir($handler)) {

    // if file isn't this directory or its parent, add it to the results
    if ($file != "." && $file != "..") {

        // check with regex that the file format is what we're expecting and not something else
        if(preg_match('#^(prefixone|prefixtwo)[^\s]*\.'.$wordpress-slug.'\.[^\s]+(\.(jpg|jpeg|png))#', $file)) {

            // add to our file array for later use
            $results[] = $file;
        }
    }
}
?>

Мне на самом деле не нужно было рекурсивного для этого, но в действительности есть много рекурсивных примеров онлайн, и это было поистине наименьшее из моих забот. Изоляция содержимого по шаблону была ядром этой задачи, поэтому приведенный выше код был достаточным.

Sidenote:

Тем, кто вчера отмечал "принятые комментарии", я понятия не имел, что я этого не хватает, и извиняюсь. У меня был плохой день. Извините, если я, похоже, хватаюсь за кого-нибудь из комментариев. Это отличное сообщество, и я счастлив вернуть туда, где могу.

4b9b3361

Ответ 1

Используйте glob, чтобы найти пути, соответствующие шаблону или GlobIterator.

Если вам нужно, чтобы быть рекурсивным , используйте RegexIterator и RecursiveDirectoryIterator.

Маркировка этого CW, потому что вопрос является верным дубликатом, и вы можете легко найти примеры для всех вышеперечисленных при использовании функции поиска. Пожалуйста, сделайте это.