【问题标题】:How to get only images using scandir in PHP?如何在 PHP 中使用 scandir 仅获取图像?
【发布时间】:2011-03-14 16:20:55
【问题描述】:

有没有办法在使用时只获取带有扩展名jpegpnggif 等的图像

$dir    = '/tmp';
$files1 = scandir($dir);

【问题讨论】:

    标签: php directory-structure file-extension scandir image-file


    【解决方案1】:

    您可以随后搜索结果数组并丢弃不符合您条件的文件。

    scandir 没有您想要的功能。

    【讨论】:

      【解决方案2】:

      您可以使用glob

      $images = glob('/tmp/*.{jpeg,gif,png}', GLOB_BRACE);
      

      如果您需要不区分大小写,您可以使用 DirectoryIteratorRegexIterator 结合使用 scandir 的结果传递给 array_map 并使用回调过滤任何不需要的扩展名。是否使用strposfnmatchpathinfo 来获取扩展取决于您。

      【讨论】:

      • 那个...不再使用scandir()。但在其他方面是正确的。那不应该是“不,glob”吗?
      • 现在让它不区分大小写。 >:)
      • @salathe 邪恶的心! :P
      • 但它不支持 unicode-charator 文件名。 :(
      【解决方案3】:

      我会遍历文件并查看它们的扩展名:

      $dir = '/tmp';
      $dh  = opendir($dir);
      while (false !== ($fileName = readdir($dh))) {
          $ext = substr($fileName, strrpos($fileName, '.') + 1);
          if(in_array($ext, array("jpg","jpeg","png","gif")))
              $files1[] = $fileName;
      }
      closedir($dh);
      

      【讨论】:

        【解决方案4】:

        这是一种仅获取图像的简单方法。适用于 PHP >= 5.2 版本。扩展名集合是小写的,因此将循环中的文件扩展名设置为小写使其不区分大小写。

        // image extensions
        $extensions = array('jpg', 'jpeg', 'png', 'gif', 'bmp');
        
        // init result
        $result = array();
        
        // directory to scan
        $directory = new DirectoryIterator('/dir/to/scan/');
        
        // iterate
        foreach ($directory as $fileinfo) {
            // must be a file
            if ($fileinfo->isFile()) {
                // file extension
                $extension = strtolower(pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION));
                // check if extension match
                if (in_array($extension, $extensions)) {
                    // add to result
                    $result[] = $fileinfo->getFilename();
                }
            }
        }
        // print result
        print_r($result);
        

        如果您想要不区分大小写和仅图像扩展,我希望这很有用。

        【讨论】:

          【解决方案5】:

          实际问题是使用 scandir,而答案最终会出现在 glob 中。在 blob 相当重的情况下,两者之间存在巨大差异。可以使用以下代码对 scandir 进行相同的过滤:

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

          我希望这会对某人有所帮助。

          【讨论】:

          • 这很好用,但 RegEx 应该在结束波浪号后有一个 'i' 以使其不区分大小写,以免过滤掉带有大写扩展名的图像/图形文件名,如 .PNG 或 .JPG
          【解决方案6】:

          如果你想扫描一个目录并只返回文件名,你可以使用这个:

          $fileNames = array_map(
              function($filePath) {
                  return basename($filePath);
              },
              glob('./includes/*.{php}', GLOB_BRACE)
          );
          

          scandir() 将返回 ... 以及文件,因此如果您只需要文件名或者您想用实际文件路径做其他事情,上面的代码更简洁

          【讨论】:

            【解决方案7】:

            我编写了代码重用并将上述解决方案的部分组合在一起,以使其更易于理解和使用:

            <?php
            //put the absolute or relative path to your target directory
            $images = scandir("./images");
            $output = array();
            $filer = '/(.jpg|.png|.jpeg|.gif|.bmp))/';
            foreach($images as $image){
              if(preg_match($filter, strtolower($image))){
                $output[] = $image;
              }
            }
            var_dump($output);
            

            【讨论】:

            • 这不起作用:Compilation failed: unmatched closing parenthesis
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-07-03
            • 2011-03-30
            • 2012-09-30
            • 2019-05-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多