Ant 的 glob 的 PHP 实现。

安装次数: 211,067,547

依赖者: 94

建议者: 2

安全: 0

星标: 252

关注者: 13

分支: 16

开放问题: 5

4.7.0 2024-03-07 20:33 UTC

README

Latest Stable Version Total Downloads

实现类似 Ant 的 globbing 的工具。

语法

  • ? 匹配任意字符
  • * 匹配零个或多个字符,除了 /
  • /**/ 匹配零个或多个目录名
  • [abc] 匹配单个字符 abc
  • [a-c] 匹配单个字符 abc
  • [^abc] 匹配除了 abc 之外的任意字符
  • [^a-c] 匹配除了 abc 之外的任意字符
  • {ab,cd} 匹配 abcd

API 文档

与 glob() 的比较

与 PHP 的原生 glob() 函数相比,此工具支持以下功能

  • /**/ 用于匹配零个或多个目录
  • 匹配自定义流包装器,如 myscheme://path/**/*.css
  • 将 globs 与路径字符串匹配
  • 通过 glob 过滤路径字符串数组
  • 如果 glob 包含无效语法,则抛出异常

由于 PHP 的原生 glob() 函数效率更高,此工具尽可能使用 glob()(即在未使用特殊功能的情况下)。

安装

使用 Composer 安装此包

composer require webmozart/glob

使用方法

该包的主要类是 Glob。使用 Glob::glob() 来 glob 文件系统

use Webmozart\Glob\Glob;

$paths = Glob::glob('/path/to/dir/*.css'); 

您还可以使用 GlobIterator 来迭代地搜索文件系统。但是,迭代器不保证返回排序后的结果

use Webmozart\Glob\Iterator\GlobIterator;

$iterator = new GlobIterator('/path/to/dir/*.css');

foreach ($iterator as $path) {
    // ...
}

路径匹配

该包还提供了一些实用方法,用于将路径与 globs 进行比较。使用 Glob::match() 将路径与 glob 匹配

if (Glob::match($path, '/path/to/dir/*.css')) {
    // ...
}

Glob::filter() 通过 glob 过滤路径列表

$paths = Glob::filter($paths, '/path/to/dir/*.css');

您还可以使用 GlobFilterIterator 迭代地实现相同的功能

use Webmozart\Glob\Iterator\GlobFilterIterator;

$iterator = new GlobFilterIterator('/path/to/dir/*.css', new ArrayIterator($paths));

foreach ($iterator as $path) {
    // ...
}

您还可以通过传递相应类的 FILTER_KEY 常量来过滤路径列表的键

$paths = Glob::filter($paths, '/path/to/dir/*.css', Glob::FILTER_KEY);

$iterator = new GlobFilterIterator(
    '/path/to/dir/*.css', 
    new ArrayIterator($paths),
    GlobFilterIterator::FILTER_KEY
);

相对 globs

不支持像 *.css 这样的相对 globs。通常,此类 globs 指的是相对于当前工作目录的路径。然而,此工具不希望做出这样的假设。因此,您应该始终传递绝对 globs,因此鼓励使用 __DIR__

use Webmozart\Glob\Glob;

$paths = Glob::glob(__DIR__ . '/*');

Windows 兼容性

必须使用正斜杠仅以规范形式传递 globs。返回的路径仅包含正斜杠。

转义

在特殊字符之前键入反斜杠字符 \ 以支持 Glob 类的转义

$paths = Glob::glob('/backup\\*/*.css');

在此示例中,glob 匹配 /backup* 目录中的所有 CSS 文件,而不是以 /backup 开头的所有目录。由于 PHP 字符串中的转义,反斜杠字符 \ 需要键入两次才能在字符串中产生单个 \

以下为可用的转义序列

  • \\?: 匹配路径中的 ?
  • \\*: 匹配路径中的 *
  • \\{: 匹配路径中的 {
  • \\}: 匹配路径中的 }
  • \\[: 匹配路径中的 [
  • \\]: 匹配路径中的 ]
  • \\^:匹配路径中的 ^
  • \\-:匹配路径中的 -
  • \\\\:匹配路径中的 \

流包装器

Glob 类支持 流包装器

$paths = Glob::glob('myscheme:///**/*.css');

作者

贡献

欢迎为该软件包做出贡献!

  • 问题跟踪器 上报告你发现的任何错误或问题。
  • 你可以在软件包的 Git 仓库 中获取源代码。

支持

如果你遇到问题,请发送邮件至 [email protected] 或在 Twitter 上 @webmozart 发出求助。

许可协议

本软件包的所有内容均受 MIT 许可协议 许可。