webmozart / glob
Ant 的 glob 的 PHP 实现。
Requires
- php: ^7.3 || ^8.0.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- symfony/filesystem: ^5.3
This package is auto-updated.
Last update: 2024-09-06 16:12:08 UTC
README
实现类似 Ant 的 globbing 的工具。
语法
?匹配任意字符*匹配零个或多个字符,除了//**/匹配零个或多个目录名[abc]匹配单个字符a、b或c[a-c]匹配单个字符a、b或c[^abc]匹配除了a、b或c之外的任意字符[^a-c]匹配除了a、b或c之外的任意字符{ab,cd}匹配ab或cd
与 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');
作者
贡献
欢迎为该软件包做出贡献!
支持
如果你遇到问题,请发送邮件至 bschussek@gmail.com 或在 Twitter 上 @webmozart 发出求助。
许可协议
本软件包的所有内容均受 MIT 许可协议 许可。