【问题标题】:Glob pattern does not match anythingGlob 模式不匹配任何内容
【发布时间】:2020-03-10 04:24:29
【问题描述】:

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

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

根据文档,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) {}

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

【问题讨论】:

  • 我检查了PHP bug tracker,似乎没有什么相关的。另一方面,我没有找到任何具有 ...(三个点)模式的工作示例。
  • 不确定这是否只是文档,因为 ... 上方是 [...] - 匹配一组字符中的一个字符。如果第一个字符是 !,则匹配任何不在组中的字符。这意味着它们不是指文字 ...,而只是一些内容。
  • @NigelRen 但如果它是“只是一些内容”,它不会也匹配文件而不仅仅是子目录吗?
  • 我只是指出,在另一个例子中, ... 并不意味着文字 ... 而是其他一些内容。它可能只是一个elipsis
  • @NigelRen 我只是说,它的功能描述“...... - 递归匹配所有子目录。” (以及它被列在特殊字符下的事实)对我来说表明它不能被解释为省略号。

标签: php directory glob


【解决方案1】:

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

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

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

  3. PHP Windows implementation 不支持目录递归

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

  5. 根据the change 的提交消息,将 glob 模式语法引入 PHP 文档,特殊字符列表基于 djgpp libc 库支持的字符列表。 djgpp manpage 声明三点语法是对旧 VMS 功能的致敬。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2016-08-17
    相关资源
    最近更新 更多