首页 > 解决方案 > Glob 模式不匹配任何内容

问题描述

注意:自从创建此线程以来,相关模式已从 PHP 文档中删除。

根据PHP 文档,该模式...递归匹配所有子目录,但是当我尝试使用它时,没有文件匹配。

根据文档,glob自 PHP 5.1 以来没有改变,但如果重要的话,我使用的是 PHP 7.2.24 。

目录结构:

.
├── bar
│   └── bar_file
└── foo
    ├── 1
    │   └── foo_1_file
    └── foo_file

PHP:

var_dump(glob('./.../*')); // prints array(0) {}
var_dump(glob('./.../foo_file')); // prints array(0) {}

我知道这个问题有一个解决方法,但我想知道是否有 PHP 本机解决方案,或者如果没有,为什么 PHP 参考文档有缺陷。

标签: phpdirectoryglob

解决方案


文档不完整甚至不正确。截至 2019 年 11 月,PHP 中没有明确支持递归 glob 语法的代码,底层操作系统库也不太可能支持它。

  1. IEEE 1003.1中没有递归 glob 语法

  2. PHP UNIX 实现从标准 C 库委托给GLOB(3) 。在 Linux 上,这很可能是不支持递归语法的 glibc 。

  3. PHP Windows 实现不支持目录递归

  4. PHP 测试套件中的所有 glob 测试都不包含涵盖三点 (...) 语法的测试。

  5. 根据在PHP 文档中引入 glob 模式语法的更改的提交消息,特殊字符列表基于 djgpp libc 库支持的字符列表。djgpp联机帮助页指出,三点语法是对旧 VMS 功能的致敬。

    ... 递归匹配所有子目录(VMS 爱好者,高兴!)。

所有这些都有力地证明了文档中列出的递归语法将不起作用,除非 PHP 运行在支持它的平台上,例如 DOS 或旧 Windows 上的 DJGPP。


推荐阅读