简化正则表达式 / srl-php
简单的正则表达式语言
Requires
- php: >=7.0.0
Requires (Dev)
- phpunit/phpunit: ^5.5
This package is not auto-updated.
Last update: 2024-09-14 19:31:18 UTC
README
我们都知道正则表达式很难读懂。一旦写出来,如果永远都不需要再碰这条代码,你会很高兴,因为你很难理解你写了什么。
在开始之前,关于如何使用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中忘记转义点这样的内容要困难得多。
让我们快速了解一下
- 首先,我们要求匹配的字符串必须开始。这样,我们确保匹配不会从某个东西的中间开始。
- 现在,我们匹配数字、字母或以下之一:点、下划线、百分号、加号或减号。我们预计会有一个或多个。
- 我们现在期望恰好有一个@ - 看起来像是一个电子邮件地址。
- 再次,数字、字母或点或减号,一次或多次。
- 一个点。看起来是TLD名称的结尾
- 到结尾,我们预计会有两个或更多字母,作为TLD。
- 现在我们要求字符串结束,以避免匹配像
invalid@email.com123
这样的内容。 - 当然,所有这些都应该是不区分大小写的,因为它是电子邮件地址。
功能
使用语言
上面你可以看到两个示例。第一个示例使用了该语言本身,第二个示例使用了查询构建器。由于使用语言比使用构建器更流畅,我们希望尽可能让你们的使用变得容易。
$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
。
贡献
喜欢这个项目?想要贡献?太棒了!请随意提出一些拉取请求或只是打开一个问题。