phlak/splat

全局模式匹配和实用工具

维护者

详细信息

github.com/PHLAK/Splat

源代码

问题

资助包维护!
PHLAK
Paypal

5.0.1 2023-03-28 15:56 UTC

README

Splat

Join our Community Become a Sponsor One-time Donation
Latest Stable Version Total Downloads License GitHub branch checks state

全局模式文件和模式匹配实用工具。

要求

安装

使用 Composer 安装 Splat。

composer require phlak/splat

然后根据需要导入 GlobPattern 类。

use PHLAK\Splat\Glob;
use PHLAK\Splat\Pattern;

模式

Glob 方法接受 $pattern 作为第一个参数。这可以是一个字符串或 \PHLAK\Splat\Pattern 的实例。

$pattern = new Pattern(...);
$pattern = Pattern::make(...);

模式字符串可以包含以下特殊匹配表达式之一或多个。

匹配表达式

  • ? 匹配任何单个字符
  • * 匹配零个或多个字符,不包括 / (\ 在 Windows 上)
  • ** 匹配零个或多个字符,包括 / (\ 在 Windows 上)
  • [abc] 匹配集合中的单个字符(即 abc
  • [a-c] 匹配范围中的单个字符(即 abc
  • [^abc] 匹配不在集合中的任何字符(即不是 abc
  • [^a-c] 匹配不在范围中的任何字符(即不是 abc
  • {foo,bar,baz} 匹配集合中的任何模式(即 foobarbaz
    • 集合可以包含其他匹配模式(即 {foo,ba[rz]}

断言

以下断言可用于断言字符串后面或不是后面跟着另一个模式。

  • (=foo) 匹配包含 foo 的任何字符串
  • (!foo) 匹配不包含 foo 的任何字符串

例如,模式 *.tar(!.{gz,xz}) 将匹配以 .tar.tar.bz 结尾的字符串,但不匹配 tar.gztar.xz

将模式转换为正则表达式

全局模式可以转换为正则表达式模式。

Pattern::make('foo')->toRegex(); // Returns '#^foo$#'
Pattern::make('foo/bar.txt')->toRegex(); // Returns '#^foo/bar\.txt$#'
Pattern::make('file.{yml,yaml}')->toRegex(); // Returns '#^file\.(yml|yaml)$#'

您可以通过 $options 参数控制正则表达式的行锚点。

Pattern::make('foo')->toRegex(Glob::NO_ANCHORS); // Returns '#foo#'
Pattern::make('foo')->toRegex(Glob::START_ANCHOR); // Returns '#^foo#'
Pattern::make('foo')->toRegex(Glob::END_ANCHOR); // Returns '#foo$#'
Pattern::make('foo')->toRegex(Glob::BOTH_ANCHORS); // Returns '#^foo$#'
Pattern::make('foo')->toRegex(Glob::START_ANCHOR | Glob::END_ANCHOR); // Returns '#^foo$#'

模式字符转义

有时字符串中的字符可能不应该被视为匹配表达式字符。在这种情况下,您可以通过在字符前加反斜杠(\)来转义任何字符。

Pattern::make('What is happening\?');
Pattern::make('Wall-E \[2008\].mp4');

您还可以使用 Pattern::escape() 方法在程序中从字符串中转义全局模式字符。

Pattern::escape('What is happening?'); // Returns 'What is happening\?'
Pattern::escape('*.{yml,yaml}'); // Returns '\*.\{yml\,yaml\}'
Pattern::escape('[Ss]pl*t.txt'); // Returns '\[Ss\]pl\*t.txt'

方法

目录中的文件

获取匹配 glob 模式的目录中的文件列表。

Glob::in('**.txt', 'some/file/path');

返回一个包含匹配指定目录中 glob 模式的文件(例如 foo.txtfoo/bar.txtfoo/bar/baz.txt 等)的 Symfony Finder Component

精确匹配

测试字符串是否匹配 glob 模式。

Glob::match('*.txt', 'foo.txt'); // true
Glob::match('*.txt', 'foo.log'); // false

匹配开始

测试字符串是否以 glob 模式开始。

Glob::matchStart('foo/*', 'foo/bar.txt'); // true
Glob::matchStart('foo/*', 'bar/foo.txt'); // false

匹配结束

测试字符串是否以 glob 模式结束。

Glob::matchEnd('**.txt', 'foo/bar.txt'); // true
Glob::matchEnd('**.txt', 'foo/bar.log'); // false

匹配内部

测试字符串是否包含 glob 模式。

Glob::matchWithin('bar', 'foo/bar/baz.txt'); // true
Glob::matchWithin('bar', 'foo/baz/qux.txt'); // false

过滤数组(字符串数组)

过滤字符串数组以匹配 glob 模式的值。

Glob::filter('**.txt', [
    'foo', 'foo.txt', 'bar.zip', 'foo/bar.png', 'foo/bar.txt',
]);

// Returns ['foo.txt', 'foo/bar.txt']

拒绝数组(字符串数组)

过滤字符串数组以匹配不匹配 glob 模式的值。

Glob::reject('**.txt', [
    'foo', 'foo.txt', 'bar.zip', 'foo/bar.png', 'foo/bar.txt',
]);

// Returns ['foo', 'bar.zip', 'foo/bar.png']

变更日志

可以在 GitHub Releases 页面上找到更改列表。

故障排除

需要一般帮助和支持,请加入我们的 GitHub 讨论区 或在 Twitter 上联系我们。

请将错误报告提交到 GitHub 问题跟踪器

版权信息

本项目采用 MIT 许可证 许可。