【问题标题】:Best way to get files from a dir filtered by certain extension in php [duplicate]从 php 中某些扩展名过滤的目录中获取文件的最佳方法 [重复]
【发布时间】:2012-01-22 09:27:06
【问题描述】:

可能重复:
PHP list of specific files in a directory
use php scandir($dir) and get only images!

所以现在我有一个目录,我得到一个文件列表

$dir_f = "whatever/random/";
$files = scandir($dir_f);

然而,它会检索目录中的每个文件。我如何以最有效的方式仅检索具有特定扩展名(例如 .ini)的文件。

【问题讨论】:

标签: php filesystems


【解决方案1】:

PHP 有一个很棒的功能可以帮助您只捕获您需要的文件。它叫glob()

glob - 查找匹配模式的路径名

返回一个包含匹配文件/目录的数组,如果没有文件匹配,则返回一个空数组,或者错误时返回 FALSE。

这是一个示例用法 -

$files = glob("/path/to/folder/*.txt");

这将使用给定路径中与*.txt 模式匹配的所有文件的列表填充$files 变量。

参考-

【讨论】:

  • 请不要回答明显的重复,但要密切投票。谢谢。
  • @gor - 需要的不仅仅是我的投票以dupe...
  • @Lix 为什么不直接使用$files = glob("/path/to/folder/*.txt") 而不使用for ?我认为是一样的
  • @MohamadOsama - 你是绝对正确的 :) 回顾我的旧代码 8 年总是很有趣哈哈!感谢您的反馈!
  • @Lix - 是的,这是非常古老的代码,但现在这些帮助我解决了我的问题。不客气,兄弟。
【解决方案2】:

如果您想要搜索多个扩展名,那么preg_grep() 是另一种过滤方式:

 $files = preg_grep('~\.(jpeg|jpg|png)$~', scandir($dir_f));

虽然glob 有类似的额外语法。如果您有更多条件,添加 ~i 标志以不区分大小写,或者可以过滤组合列表,这通常是有意义的。

【讨论】:

  • glob("{$dir}*.{jpg,jpeg,gif,ico,png}", GLOB_BRACE)。这也适用于多个扩展。
  • 这个答案对我非常有帮助!我试图在包含数万到数十万个文件的文件夹中搜索数百个不同的文件标识符和文件。 glob 无法处理这么大的搜索字符串,如果我分成更小的字符串并循环,则需要几分钟。将 preg_grep 与 scandir 一起使用大约需要 5 秒!
  • 感谢您向我介绍 preg_grep。与可以处理不区分大小写的 glob 相比,这更有帮助。
  • 这适用于路径中的方括号,而使用 glob() 的方括号必须转义。
【解决方案3】:

PHP 的glob() 函数让您指定要搜索的模式。

【讨论】:

    【解决方案4】:

    您可以尝试使用GlobIterator

    $iterator = new \GlobIterator(__DIR__ . '/*.txt', FilesystemIterator::KEY_AS_FILENAME);
    $array = iterator_to_array($iterator);
    var_dump($array);
    

    【讨论】:

      【解决方案5】:

      glob($pattern, $flags)

      <?php
      foreach (glob("*.txt") as $filename) {
          echo "$filename size " . filesize($filename) . "\n";
      }
      ?>
      

      【讨论】:

        【解决方案6】:

        试试这个

        //path to directory to scan
        $directory = "../file/";
        
        //get all image files with a .txt extension.
        $file= glob($directory . "*.txt ");
        
        //print each file name
        foreach($file as $filew)
        {
        echo $filew;
        $files[] = $filew; // to create the array
        
        }
        

        【讨论】:

        • 我不知道任何带有.text 扩展名的文件。
        • @MadaraUchiha 抱歉打错了
        • 可能有任何扩展名的文件
        【解决方案7】:

        尚未测试正则表达式,但类似这样:

        if ($handle = opendir('/file/path')) {
        
            while (false !== ($entry = readdir($handle))) {
                if (preg_match('/\.txt$/', $entry)) {
                    echo "$entry\n";
                }
            }
        
            closedir($handle);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-19
          • 2011-06-03
          • 1970-01-01
          • 2014-09-26
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          相关资源
          最近更新 更多