rawr / t-regx
将PHP正则表达式提升到现代标准。
Requires
- php: >=7.4.0
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^9.6.12
- rawr/phpunit-data-provider: ^3.1.0
- dev-master
- 1.0.0-alpha1
- 1.0.0-alpha
- 0.41.5
- 0.41.4
- 0.41.3
- 0.41.2
- 0.41.1
- 0.41.0
- 0.40.0
- 0.39.0
- 0.38.0
- 0.37.2
- 0.37.1
- 0.37.0
- 0.36.0
- 0.35.0
- 0.34.2
- 0.34.1
- 0.34.0
- 0.33.0
- 0.32.0
- 0.31.0
- 0.30.0
- 0.29.0
- 0.28.1
- 0.28.0
- 0.27.0
- 0.26.0
- 0.25.0
- 0.24.0
- 0.23.1
- 0.23.0
- 0.22.0
- 0.21.0
- 0.20.3
- 0.20.2
- 0.20.1
- 0.20.0
- 0.19.2
- 0.19.1
- 0.19.0
- 0.18.1
- 0.18.0
- 0.17.0
- 0.16.0
- 0.15.0
- 0.14.1
- 0.14.0
- 0.13.8
- 0.13.7
- 0.13.6
- 0.13.5
- 0.13.4
- 0.13.3
- 0.13.2
- 0.13.1
- 0.13.0
- 0.12.0
- 0.11.0
- 0.10.2
- 0.10.1
- 0.10.0
- 0.9.14
- 0.9.13
- 0.9.12
- 0.9.11
- 0.9.10
- 0.9.9
- 0.9.8
- 0.9.7
- 0.9.6
- 0.9.5
- 0.9.4
- 0.9.3
- 0.9.2
- 0.9.1
- 0.9.0
- dev-develop
- dev-legacy
- dev-groupName
This package is auto-updated.
Last update: 2024-09-12 19:22:28 UTC
README
T-Regx | 正则表达式库
将PHP正则表达式提升到现代标准。
查看文档 - t-regx.com.
安装
适用于PHP 7.1及以后版本(包括PHP 8)的安装
composer require rawr/t-regx
T-Regx只需要mb-string
扩展。不需要其他依赖项或扩展。
示例
方法match()
、test()
和count()
的示例。
$pattern = Pattern::of("ups"); // pattern("ups") also works $matcher = $pattern->match('yay, ups'); foreach ($matcher as $detail) { $detail->text(); // (string) "ups"; $detail->offset(); // (int) 0 } if (!$matcher->test()) { echo "No occurrances found"; } else { echo "Found {$matcher->count()} occurrences"; }
文档
完整的API文档可在t-regx.com找到。变更列表可在ChangeLog.md中找到。
快速链接
在线尝试,在您的浏览器中!
打开T-Regx fiddle,在您的浏览器中开始尝试。 现在尝试!
API
选择接口
-
我选择现代正则表达式API
滚动查看 -
pattern()->test()
,pattern()->match()
,pattern()->replace()
-
我选择保留PHP方法(但会保护免受错误/警告的影响)
滚动查看 -
preg::match_all()
,preg::replace_callback()
,preg::split()
对于标准项目,我们建议使用pattern()
。对于旧项目,我们建议使用preg::match_all()
。
-
标准T-Regx
$pattern = Pattern::of("ups"); // pattern("ups") also works $matcher = $pattern->match('yay, ups'); if (!$matcher->test()) { echo "Unmatched subject :/"; } foreach ($matcher as $detail) { $detail->text(); // (string) "ups"; $detail->offset(); // (int) 0 } $pattern->replace('well, ups')->with('heck') // (string) "well, heck";
-
旧版API
try { preg::match_all('/?ups/', 'ups', $match, PREG_PATTERN_ORDER); echo $match[0][0]; } catch (\TRegx\Exception\MalformedPatternException $exception) { echo "Invalid pattern"; }
T-Regx为何脱颖而出?
-
预定义模式
使用用户数据在PCRE中并不总是安全的(即使是使用
preg_quote()
),而且使用起来也不那么方便。T-Regx提供了针对构建包含不安全用户输入的模式的专业解决方案。选择Pattern::inject()
以简单地将用户数据作为字面量包含在内。使用Pattern::mask()
将用户提供的掩码转换为完整的模式,同时确保安全。使用Pattern::template()
来构建更复杂的模式。function makePattern($name): Pattern { if ($name === null) { return Pattern::of("name[:=]empty"); } return Pattern::inject("name[:=]@;", [$name]); // inject $name as @ } $gibberish = "(my?name)"; $pattern = makePattern($gibberish); $pattern->test('name=(my?name)'); // (bool) true
-
与开发者一起工作
- 简单方法
- T-Regx通过简单的方法暴露功能,这些方法返回
int
、string
、string[]
或bool
,这些都不是可空的。如果您想对您的匹配项或模式做些什么,可能有一个方法可以做到这一点,它正好只做那件事。
- T-Regx通过简单的方法暴露功能,这些方法返回
- 字符串
- 使用多字节偏移量修复错误(UTF-8安全).
- 单独的方法用于位置
offset()
- 返回匹配项在UTF-8字符中的位置byteOffset()
- 返回匹配项在字节中的位置,无论编码如何
- 组
-
当使用
preg::match_all()
时,我们收到一个数组,其中包含多个数组,然后是数组。相比之下,T-Regx返回一个组数组:Group[]
。对象Group
包含有关组的所有信息。 -
组错误
- 当使用无效的组名称
get('!@#')
时,T-Regx抛出\InvalidArgumentException
。 - 当尝试读取缺失的组时,T-Regx抛出
NonexistentGroupException
。 - 当读取未匹配的组时,T-Regx抛出
GroupNotMatchedException
。
- 当使用无效的组名称
-
- 简单方法
-
使用干净的API编写
- 描述性、简单的接口
- 开箱即用的Unicode支持
- 没有使用反射,
No (...varargs)
,No (boolean arguments, true)
,(No flags, 1)
,[No [nested, [arrays]]]
- T-Regx消除了PHP版本之间的不一致性
-
保护您免受致命错误的影响
某些参数会导致
preg_()
方法出现致命错误,这会导致应用程序终止,并且无法捕获。T-Regx会预测给定的参数是否会导致致命错误,并将抛出一个可捕获的异常。 -
T-Regx遵循Uncle Bob和“Clean Code”的哲学
函数应该做一件事情,而且应该做好。函数应该做到您期望它做到的。
-
与其他工具和库兼容
诚然,
Pattern::of()
接受未限定的模式((Foo){3,4}}
)与其他PHP库不兼容,这些库使用限定模式(/(Foo){3,4}/
)工作,例如Laravel和路由。在这种情况下,使用接受普通标准PHP语法的PcrePattern::of()
。 -
异常优于警告/错误
- 与PHP方法不同,T-Regx不使用警告/通知/错误来处理意外输入
try { preg::match_all('/([a3]+[a3]+)+3/', 'aaaaaaaaaaaaaaaaaaaa 3'); } catch (\TRegx\SafeRegex\Exception\CatastrophicBacktrackingException $exception) { // caught }
- 检测和抛出
MalformedPatternException
的malformed patterns
。这不能用preg_last_error()
捕获。try { preg::match('/?ups/', 'ups'); } catch (\TRegx\Exception\MalformedPatternException $exception) { // caught }
- 并非PHP中的每个错误都可以从
preg_last_error()
中读取,但是T-Regx为这些事件抛出专门的异常。
- 与PHP方法不同,T-Regx不使用警告/通知/错误来处理意外输入
比较
或
正在进行中的工作
关于1.0版本发布的发展优先级
- 将SafeRegex和CleanRegex分开成两个包,以便用户可以选择他们需要的内容 #103
- 为每个T-Regx公共方法添加文档 #17 [进行中]
- 重新设计t-regx.com文档 [进行中]
- 发布1.0
赞助商
- Andreas Leathley - 开发SquirrelPHP
- BarxizePL - 感谢!
感谢以下贡献者开发T-Regx:
许可证
T-Regx采用MIT许可证。