Найти все файлы в каталоге со строкой или шаблоном в имени файла с PHP - PullRequest
20 голосов
/ 18 января 2011

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

Обновление + Окончательное решение: 18.01.2011 @ 20:06

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

Это решениев основном проверяет наличие определенных изображений с начальным префиксом «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:

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

1 Ответ

15 голосов
/ 18 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...