简单的正则表达式语言

0.1.0 2016-10-13 14:45 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:31:18 UTC


README

codecov Build Status License

我们都知道正则表达式很难读懂。一旦写出来,如果永远都不需要再碰这条代码,你会很高兴,因为你很难理解你写了什么。

在开始之前,关于如何使用SRL的简要说明:你可以直接使用此项目,或者,如果你不使用PHP或包含类似库,你可以在网上构建查询并使用生成的正则表达式。

https://simple-regex.com/build

一个示例

正则表达式不必庞大? - 不,它们不!看看这个

begin with any of (digit, letter, one of "._%+-") once or more,
literally "@",
any of (digit, letter, one of ".-") once or more,
literally ".",
letter at least 2,
must end, case insensitive

或者,如果你喜欢,代码本身的一个实现

$query = SRL::startsWith()
    ->anyOf(function (Builder $query) {
        $query->digit()
            ->letter()
            ->oneOf('._%+-');
    })->onceOrMore()
    ->literally('@')
    ->anyOf(function (Builder $query) {
        $query->digit()
            ->letter()
            ->oneOf('.-');
    })->onceOrMore()
    ->literally('.')
    ->letter()->atLeast(2)
    ->mustEnd()->caseInsensitive();

是的,确实,这两个示例肯定比相应的正则表达式长

/^([A-Z0-9._%+-])+@[A-Z0-9.-]+\.[A-Z]{2,}$/i

但是,无论如何,上面的内容更易于阅读,并且肯定更容易维护,不是吗?而且,更重要的是:在SRL中忘记转义点这样的内容要困难得多。

让我们快速了解一下

  1. 首先,我们要求匹配的字符串必须开始。这样,我们确保匹配不会从某个东西的中间开始。
  2. 现在,我们匹配数字、字母或以下之一:点、下划线、百分号、加号或减号。我们预计会有一个或多个。
  3. 我们现在期望恰好有一个@ - 看起来像是一个电子邮件地址。
  4. 再次,数字、字母或点或减号,一次或多次。
  5. 一个点。看起来是TLD名称的结尾
  6. 到结尾,我们预计会有两个或更多字母,作为TLD。
  7. 现在我们要求字符串结束,以避免匹配像invalid@email.com123这样的内容。
  8. 当然,所有这些都应该是不区分大小写的,因为它是电子邮件地址。

功能

使用语言

上面你可以看到两个示例。第一个示例使用了该语言本身,第二个示例使用了查询构建器。由于使用语言比使用构建器更流畅,我们希望尽可能让你们的使用变得容易。

$srl = new SRL('literally "colo", optional "u", literally "r"');
preg_match($srl, 'color') // 1
$srl->isMatching('colour') // true
$srl->isMatching('soup') // false

以下所有内容都适用于SRL本身和查询构建器。

匹配

SRL和上面示例中所述一样简单。要检索可以由外部工具(如preg_match)使用的正则表达式,要么使用->get()方法,要么直接将其转换为字符串。

preg_match($query, 'sample@email.com');

当然,你可以使用内置的匹配方法以更简单的方式进行

$query->isMatching('sample@email.com'); // true
$query->isMatching('invalid-email.com'); // false

捕获组

由于正则表达式不仅用于验证,因此SRL也支持捕获组。与之前定义正则表达式一样,只需简单添加一个capture组,该组将匹配在lambda函数中定义的查询。可选地,可以设置该捕获组的名称(例如color)。

// Using SRL
$regEx = new SRL('literally "color:", whitespace, capture (letter once or more) as "color", literally "."');

// Using the query builder
$regEx = SRL::literally('color:')->whitespace()->capture(function (Builder $query) {
    $query->letter()->onceOrMore();
}, 'color')->literally('.');

$matches = $regEx->getMatches('Favorite color: green. Another color: yellow.');

echo $matches[0]->get('color'); // green
echo $matches[1]->get('color'); // yellow

每个匹配将传递给一个SRL\Match对象,该对象将返回找到的匹配项。

额外的PCRE函数

请随意使用所有可用的PCRE PHP函数与SRL结合使用。尽管如此,为什么费心呢?我们已经为所有常用函数提供了包装器,并增加了额外功能。就像上面一样,只需直接在SRL或构建器上应用以下方法之一即可

  • isMatching() - 验证表达式是否与给定的字符串匹配。
  • getMatches() - 获取所有提供的捕获组的匹配项。
  • getMatch() - 获取提供的捕获组的第一个匹配项。
  • replace() - 使用表达式替换数据。
  • split() - 通过表达式将字符串拆分为数组。
  • filter() - 使用表达式过滤项目。

前瞻

如果您希望某些正则表达式仅在特定条件下应用,前瞻可能是您要找的。

例如查询

// SRL:
new SRL('capture (literally "foo") if followed by (literally "bar")');

// Query Builder:
SRL::capture(function (Builder $query) {
    $query->literally('foo');
})->ifFollowedBy(function (Builder $query) {
    $query->literally('bar');
});

您可以轻松捕获 'foo',但仅当此匹配项后面跟着 'bar' 时。

但说实话,查询构建器版本对此类简单事物来说代码太多了,对吧?没问题!我们不仅支持子表达式、字符串和构建器对象的匿名函数,还支持。这难道不是很好吗?只需看看一个可能的示例

SRL::capture('foo')->ifFollowedBy(SRL::literally('bar'));

如果需要,也可以使用后顾。使用 ifAlreadyHad() 您可以在前一个字符串包含特定模式的情况下验证特定条件。

性能

构建的正则表达式将被缓存,因此您不必担心每次调用 match-方法时都创建它。而且,由于它底层是一个普通的正则表达式,性能不会成问题。

当然,构建表达式可能需要一些时间,但在实际应用中,这不应该引起注意。但如果您喜欢,您可以在其他地方构建表达式,只需在您的应用程序中使用结果即可。如果您这样做,请将查询的代码保存在某处并链接到它,否则正则表达式将像之前一样不可读。

使用

将包添加到您的 composer.json-文件的 require 部分并更新您的项目。

"require": {
    "simpleregex/srl-php": "0.1.x-dev"
}
composer update

要做的事情

我们肯定还没有完成。还有许多事情要做。计划要做的一小部分包括

  • 更多功能
  • 更多文档
  • 变量支持
  • 统治世界

许可证

SRL 在 MIT 许可证下发布。有关更多信息,请参阅 LICENSE

贡献

喜欢这个项目?想要贡献?太棒了!请随意提出一些拉取请求或只是打开一个问题。