【问题标题】:help with glob pattern帮助 glob 模式
【发布时间】:2011-01-06 06:14:25
【问题描述】:

如果有人能给我一个 glob 的正则表达式模式来获取以下文件名,那就太好了:

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

返回不带“_thumb”的文件。我有这个模式:

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

这给了我所有的“_thumb”。

【问题讨论】:

    标签: php glob


    【解决方案1】:

    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();
        }
    }
    

    您可以在迭代过程中干净地修改您的条件(此外,如果您需要 recursive directory iteration,也可以轻松修改迭代器)。

    【讨论】:

    • 有可能glob() 可以由 libc 处理,因此从它开始意味着您将在更慢的 PHP 中迭代更少的结果。
    【解决方案2】:

    全局模式和正则表达式是不同的。但是 PHP 的 glob 实现并没有实现匹配这些文件所需的模式否定。您将需要使用更大的正面模式,例如[0-9]*.jpg,然后过滤结果。

    【讨论】:

      【解决方案3】:
      foreach (glob('[0-9]*') as $filename) {
          if (strpos("$filename","_thumb") === FALSE){
              echo "$filename \n";
          }
      }
      

      【讨论】:

        【解决方案4】:

        除了 DirectoryIterator 的 zombat's use 之外,构建您自己的专用过滤器类以使生活更轻松(查看与 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;
        }
        

        当然,如果不需要在多个地方执行此操作,那么 zombat 给出的普通 DirectoryIterator/condition 组合非常合适。

        【讨论】:

          猜你喜欢
          • 2011-04-18
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多