hoels/regex

正则表达式的包装器。

1.2 2023-12-10 18:20 UTC

This package is auto-updated.

Last update: 2024-09-10 19:55:32 UTC


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对象的valueoffset属性将与其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();
}