nick-jones/globby

glob通配符 → 正则表达式转换库

v0.3.0 2015-02-21 18:32 UTC

This package is not auto-updated.

Last update: 2024-09-24 05:34:27 UTC


README

Build Status Scrutinizer Code Quality Code Coverage HHVM Status

Globby 是一个 glob 通配符 → 正则表达式转换库。

在您开始使用此库之前,请注意这很可能不是您想要的。Glob 通配符模式与正则表达式模式非常相似;因此,如果您希望在应用程序中使用模式匹配,您最好使用 preg_match()。另外,如果您希望对文件路径进行模式匹配,则当然可以使用 glob()GlobIteratorfnmatch()

如果您有这个库可以满足的有限的使用场景之一,请继续阅读。

关于

Globby 能够将 glob 通配符模式编译成正则表达式。以下特性被支持:

  • 多字符通配符(*
  • 单字符通配符(?
  • 字符组/类([abc]
  • 否定字符组/类([!abc][^abc]
  • 字符范围(a-z0-9 等)
  • POSIX 字符类([:alpha:][:digit:] 等)
  • 转义字符(\

它不支持排序符号(例如 [.ch.])和等价类表达式(例如 [=a=])。

与许多 glob 模式 → 正则表达式转换解决方案不同,Globby 不会对模式进行简单的替换。转换过程涉及使用 Phlexy 分析提供的模式,然后根据标记输出构建正则表达式。

警告

glob 模式 → 正则表达式转换过程速度慢且资源密集。所以在此提醒,您可能想要使用 preg_match()

编译阶段对于任何给定实例只发生一次,因此对于使用固定模式集的长运行应用程序,您可能无需过多担心;初始编译将是密集的,但后续匹配将利用缓存的正则表达式。

如果您打算在短运行应用程序(例如 Web 应用程序)中使用此库,那么您最好使用一种实现来缓存 glob 模式 → 正则表达式转换,例如在每次相关请求上避免编译步骤(假设模式是合理的固定。)

安装

您可以通过 composer 安装 Globby

composer require nick-jones/globby

用法

简单创建一个 \Globby\Pattern 实例,在构造函数中提供模式。 toRegex() 方法将给出模式的正则表达式等效项。示例

$pattern = new \Globby\Pattern('wow\[such\]?pat\*ter[nr][!,]!*wild[[:digit:]]');
var_dump($pattern->toRegex());
// result: string(48) "#^wow\[such\].pat\*ter[nr][^,]\!.*wild[[:digit:]]$#u"

为了方便起见,该接口还提供了一个 match($value) 方法,该方法直接将正则表达式插入 preg_match,指示提供的值是否与模式匹配。示例

$pattern = new \Globby\Pattern('wow\[such\]?pat\*ter[nr][!,]!*wild[[:digit:]]');
var_dump($pattern->match('wow[such]:pat*tern.!much.wild9'));
// result: bool(true)

如果提供的模式无效,您可能会遇到 TokenizeException。例如,如果字符分组保持开放,则可能会发生这种情况。

$pattern = new \Globby\Pattern('[abc'); // should have been closed with an "]"
// result: exception 'Globby\Tokenizer\TokenizeException' with message 'Premature end of pattern'

测试

Globby 的单元测试和集成测试使用 PHPUnit 构建。这些测试文件分别位于 test/unit/test/integration/ 目录中。这些测试配置在项目根目录下的 phpunit.xml 文件中。

PHPUnit 被列为该项目的开发依赖;因此,您可以直接运行 ./vendor/bin/phpunit 来执行测试。

还提供了一个简单的功能测试套件,有关更多信息,请参阅 test/functional/