Dir-Content to array - 排除具有特定模式的文件

时间:2015-05-18 11:44:34

标签: php regex scandir

我想收集特定目录中的所有文件(目前我使用scandir) - 但只有那些没有特殊模式的文件。

示例:

full/path/to/test.php

在这种情况下,我想在我的数组中得到someimage.png和someotherimage.png。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:0)

要获取仅由字母组成的文件名数组,您可以使用:

$array = array();
$handle = opendir($directory);
while ($file = readdir($handle)) {
    if(preg_match('/^[A-Za-z]+\.png$/',$file)){
      $array[] = $file;
   }
}

答案 1 :(得分:0)

此正则表达式会在$correctFiles中填入所有不包含尺寸(例如42x42)的png图像。

<?php

// here you get the files with scandir, or any method you want
$files = array(
    'someimage.png',
    'someimage-150x150.png',
    'someimage-233x333.png',
    'someotherimage.png',
    'someotherimage-760x543.png',
    'someotherimage-150x50.png'
);

$correctFiles = array(); // This will contain the correct file names
foreach ($files as $file)
    if (!preg_match('/^.*-\d+x\d+\.png$/', $file)) // If the file doesn't have "NUMBERxNUMBER" in their name
        $correctFiles[] = $file;

print_r($correctFiles); // Here you can do what you want with those files

如果您不想将名称存储在数组中(更快,更少的内存消耗),您可以使用下面的代码。

<?php

// here you get the files with scandir, or any method you want
$files = array(
    'someimage.png',
    'someimage-150x150.png',
    'someimage-233x333.png',
    'someotherimage.png',
    'someotherimage-760x543.png',
    'someotherimage-150x50.png'
);

foreach ($files as $file)
    if (!preg_match('/^.*-\d+x\d+\.png$/', $file)) // If the file doesn't have "NUMBERxNUMBER" in their name
    {
        print_r($file); // Here you can do what you want with this file
    }

答案 2 :(得分:0)

OOP方式可以是将DirectoryIterator与FilterIterator结合使用:

class FilenameFilter extends FilterIterator {

    protected $filePattern;

    public function __construct(Iterator $iterator , $pattern) {
        parent::__construct($iterator);
        $this->filePattern = $pattern;
    }

    public function accept() {
        $currentFile = $this->current();
        return (1 === preg_match($this->filePattern, $currentFile));
    }
}

用法:

$myFilter = new FilenameFilter(new DirectoryIterator('path/to/your/files'), '/^[a-z-_]*\.(png|PNG|jpg|JPG)$/i');
foreach ($myFilter as $filteredFile) {
    // Only files which match your specified pattern should appear here
    var_dump($filteredFile);
}

这只是一个想法,代码没有经过测试,但是。希望有所帮助;

答案 3 :(得分:0)

    $files = array(
        "someimage.png",
        "someimage-150x150.png",
        "someimage-233x333.png",
        "someotherimage.png",
        "someotherimage-760x543.png",
        "someotherimage-150x50.png",
    );
    foreach ( $files as $key => $value ) {
        if ( preg_match( '@\-[0-9]+x[0-9]+\.(png|jpe?g|gif)$@', $value ) ) {
            unset( $files[$key] );
        }
    }
    echo '<xmp>' . print_r( $files, 1 ) . '</xmp>';