nick-jones / globby
glob通配符 → 正则表达式转换库
Requires
- php: >=5.5
- nikic/phlexy: v0.1
Requires (Dev)
- phpunit/phpunit: 3.7.*
README
Globby 是一个 glob 通配符 → 正则表达式转换库。
在您开始使用此库之前,请注意这很可能不是您想要的。Glob 通配符模式与正则表达式模式非常相似;因此,如果您希望在应用程序中使用模式匹配,您最好使用 preg_match()
。另外,如果您希望对文件路径进行模式匹配,则当然可以使用 glob()
、GlobIterator
或 fnmatch()
。
如果您有这个库可以满足的有限的使用场景之一,请继续阅读。
关于
Globby 能够将 glob 通配符模式编译成正则表达式。以下特性被支持:
- 多字符通配符(
*
) - 单字符通配符(
?
) - 字符组/类(
[abc]
) - 否定字符组/类(
[!abc]
、[^abc]
) - 字符范围(
a-z
、0-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/
。