cpsit/glob

A PHP 实现Ant的glob。

维护者

详细信息

github.com/CPS-IT/glob

源代码

5.0.0 2019-03-26 09:56 UTC

This package is auto-updated.

Last update: 2024-08-26 23:43:48 UTC


README

实现类似Ant的glob功能的工具。

注意: 这是一个 webmozart/glob 的分支。与原始版本相比,它支持PHP >= 7.0。

我们必须将供应商名称从 Webmozart 更改为 CPSIT

语法

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

API 文档

与 glob() 的比较

与PHP的本地 glob() 函数相比,此实用程序支持

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

由于PHP的本地 glob() 函数效率更高,此实用程序尽可能使用 glob()(即当不使用特殊功能时)。

安装

使用 Composer 安装包

$ composer require webmozart/glob

用法

包的主要类是 Glob。使用 Glob::glob() 对文件系统进行glob

use CPSIT\Glob\Glob;

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

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

use CPSIT\Glob\Iterator\GlobIterator;

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

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

路径匹配

该包还提供用于将路径与glob比较的实用方法。使用 Glob::match() 将路径与glob匹配

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

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

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

这也可以通过 GlobFilterIterator 递归地实现

use CPSIT\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
);

相对Glob

不支持相对glob,如 *.css。通常,此类glob引用的是当前工作目录的相对路径。然而,此实用程序不想做出此类假设。因此,您应始终传递绝对glob。

如果您想允许用户传递相对glob,我建议使用 Webmozart Path Utility 将glob转换为绝对glob

use CPSIT\Glob\Glob;
use Webmozart\PathUtil\Path;

// If $glob is absolute, that glob is used without modification.
// If $glob is relative, it is turned into an absolute path based on the current
// working directory.
$paths = Glob::glob(Path::makeAbsolute($glob, getcwd());

Windows 兼容性

Glob需要以仅包含正斜杠的规范形式传递。返回的路径仅包含正斜杠。

转义

Glob 类支持通过在任意特殊字符之前输入反斜杠字符 \ 来转义

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

在这个示例中,通配符匹配的是/backup*目录下的所有CSS文件,而不是以/backup开头的所有目录。由于PHP字符串中的转义特性,要在一个字符串中产生单个反斜杠\,需要输入两个反斜杠\

以下是一些可用的转义序列:

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

流包装器

Glob类支持流包装器

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

作者

贡献

欢迎为该包做出贡献!

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

支持

如果您遇到问题,请发送邮件至bschussek@gmail.com或在Twitter上关注@webmozart

许可证

本包的所有内容均受MIT许可证的许可。