помочь с шаблоном шара - PullRequest
       11

помочь с шаблоном шара

5 голосов
/ 18 января 2010

Было бы неплохо, если бы кто-нибудь дал мне шаблон регулярного выражения для glob для получения имен файлов ниже:

1.jpg // this file
1_thumb.jpg
2.png // this file
2_thumb.png
etc...

возврат файлов без "_thumb". У меня есть этот шаблон:

$numericalFiles = glob("$this->path/*_thumb.*");

и это дает мне все с "_thumb."

Ответы [ 4 ]

6 голосов
/ 18 января 2010

glob() - не самое лучшее для обработки ситуаций, когда у вас есть сложные требования к сопоставлению файлов, как вы четко заметили. Я бы рекомендовал использовать библиотеку PHP SPL и воспользоваться классом DirectoryIterator .

$iterator = new DirectoryIterator("/dir/path");
foreach ($iterator as $file) {
    if ($file->isFile() && preg_match("/^[0-9]+\./i",$file->getFilename())) {
        echo $file->getFilename();
    }
}

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

3 голосов
/ 18 января 2010
foreach (glob('[0-9]*') as $filename) {
    if (strpos("$filename","_thumb") === FALSE){
        echo "$filename \n";
    }
}
3 голосов
/ 18 января 2010

Шаблоны глобусов и регулярные выражения различны. Но глобальная реализация PHP не реализует отрицание шаблона, необходимое для сопоставления только этих файлов. Вам нужно будет использовать больший положительный шаблон, такой как [0-9]*.jpg, а затем отфильтровать результаты.

1 голос
/ 22 января 2010

В дополнение к использованию zombat из DirectoryIterator, также может иметь смысл создать собственный специализированный класс фильтров, чтобы упростить жизнь (см. Разницу с циклами foreach) и сделать ее более пригодной для повторного использования.

class DirectoryFilterThumbs extends FilterIterator {
    public function __construct($path) {
        parent::__construct(new DirectoryIterator($path));
    }
    public function accept() {
        // Use regex or whatever you like here
        return ($this->isFile() && strpos($this->getFilename(), "_thumb.") === FALSE);
    }
}

$files = new DirectoryFilterThumbs("/dir/path");
foreach ($files as $file) {
    echo $file->getFilename() . PHP_EOL;
}

Конечно, если нет необходимости делать это в нескольких местах, тогда вполне подходит простая комбинация DirectoryIterator / condition, предоставленная zombat.

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