hoels / regex
正则表达式的包装器。
Requires
- php: >=8.1
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^10.5
- squizlabs/php_codesniffer: ^3.8
README
这是一个正则表达式的包装器。
PHP中的正则表达式是常见的失败点,特别是与匹配组一起使用时可能会带来巨大的头疼。受到Kotlin的Regex类功能的启发,我决定开始为PHP实现类似的功能。希望有一天,PHP团队能够改进preg_*函数,这个库为PHP中的正则表达式提供了一个非常简单的包装器。
与Kotlin实现相比,分隔符(例如表达式开头和结尾的/)必须设置。这提供了更大的灵活性。
安装
需求
- PHP 8.1+
Composer
composer require hoels/regex
文档
Regex类
这个库的主要类是Regex类。该类目前提供以下功能
containsMatchIn
Regex::containsMatchIn(string $regex, string $input): bool
指示在$input中是否存在至少一个与$regex中提供的正则表达式匹配的匹配项。
find
Regex::find(string $regex, string $input): MatchResult|null
返回$input中与$regex中提供的正则表达式匹配的第一个匹配项。如果没有匹配项,则返回null,如果存在匹配项,则返回一个MatchResult对象。
findAll
Regex::findAll(string $regex, string $input): MatchResult[]
返回一个包含所有匹配项的MatchResult对象的数组,这些匹配项位于$input中,对于在$regex中提供的正则表达式。如果没有匹配项,则返回一个空数组。
matchAt
Regex::matchAt(string $regex, string $input, int $index): MatchResult|null
返回$input中与$regex中提供的正则表达式匹配的第一个匹配项,仅当匹配从$index开始时。如果没有匹配项,则返回null,如果存在匹配项在$index处,则返回一个MatchResult对象。
replace
Regex::replace(string $regex, string $input, string $replacement): string
将$input中所有$regex的匹配项替换为替换表达式$replacement。示例
echo Regex::replace("/(\\d\\.\\d)\\.\\d+/", "We support PHP 8.1.26 and 8.2.13.", "$1"); // We support PHP 8.1 and 8.2.
replaceFirst
Regex::replaceFirst(string $regex, string $input, string $replacement): string
将$input中第一个$regex的匹配项替换为替换表达式$replacement。示例
echo Regex::replaceFirst("/(\\d\\.\\d)\\.\\d+/", "We support PHP 8.1.26 and 8.2.13.", "$1"); // We support PHP 8.1 and 8.2.3.
MatchResult类
MatchResult类有三个属性
value(string):匹配的字符串。offset(int):匹配字符串在输入字符串中的偏移量。groups(MatchGroup[]):所有匹配组的数组。
组
groups属性包含一个MatchGroup对象的数组。
第一个元素(索引0)始终表示匹配的字符串,因此MatchGroup对象的value和offset属性将与其MatchResult父对象的属性相同。
如果正则表达式没有声明任何组,则数组中只有一个元素。
如果正则表达式声明了组,则将为出现的每个组创建一个MatchGroup对象。因此,第一个组的索引为1,第二个组的索引为2,依此类推。如果有命名组,则将有以名称为索引的附加数组元素。请注意,MatchGroup对象将具有与具有数字索引的对象相同的属性,但对象引用将不同。
MatchGroup类
MatchGroup类有两个属性
value(string|null):匹配的字符串或null,如果声明的组在匹配的字符串之外。offset(int):匹配字符串在输入字符串中的偏移量。如果声明的组在匹配字符串之外,则为-1。
用法
Regex::containsMatchIn
use Regex\Regex; if (Regex::containsMatchIn(pattern: "/^[a-z]+$/", subject: $_GET["input"])) { ... }
Regex::find
use Regex\Regex; $matchResult = Regex::find(pattern: "/(?P<year>\d{4})\/(?P<month>\d{2})\/(?P<day>\d{2})/", subject: $input); if ($matchResult !== null) { $year = $matchResult->getGroup("year")?->getValue(); $month = $matchResult->getGroup("month")?->getValue(); $day = $matchResult->getGroup("day")?->getValue(); }