最近在开发一个内容过滤系统和一套灵活的路由机制时,我遇到了一个让人头疼的问题。系统需要根据用户定义的成百上千个关键词进行匹配,同时路由系统也需要支持多种模式,包括固定路径和动态参数(如
/product/(\d+)
起初,我尝试手动拼接正则表达式,比如将所有关键词用
|
我迫切需要一个工具,能够自动化、智能化地生成高效的正则表达式。在一番探索之后,我发现了
s9e/regexp-builder
Composer在线学习地址:学习地址
s9e/regexp-builder
s9e/regexp-builder
例如,如果你给它
['foo', 'bar', 'baz']
(foo|bar|baz)
ba[rz]|foo
s9e/regexp-builder
首先,通过 Composer 将其添加到你的项目中:
<pre class="brush:php;toolbar:false;">composer require s9e/regexp-builder
最简单的用法是使用其提供的工厂方法获取一个构建器实例,然后传入字符串列表。
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use s9e\RegexpBuilder\Factory\PHP;
// 获取适用于 PHP (PCRE2) 引擎的构建器
$builder = PHP::getBuilder();
$keywords = ['apple', 'banana', 'orange', 'apricot'];
// 构建正则表达式
$regexp = $builder->build($keywords);
echo '/' . $regexp . '/';
// 可能会输出类似:/ap(?:ple|ricot)|banana|orange/ (实际输出可能因版本和优化策略而异)
// 测试匹配
if (preg_match('/' . $regexp . '/', 'I like banana and apple.')) {
echo "\n匹配成功!";
}可以看到,它将
apple
apricot
ap(?:ple|ricot)
s9e/regexp-builder
<pre class="brush:php;toolbar:false;"><?php require 'vendor/autoload.php'; use s9e\RegexpBuilder\Factory\JavaScript; use s9e\RegexpBuilder\Factory\PHP; $strings = ['?', '?']; // PHP (PCRE) 默认处理字节,需要 'u' 修饰符才能正确处理 Unicode $phpBuilder = PHP::getBuilder(); echo 'PHP (无u修饰符): /', $phpBuilder->build($strings), "/\n"; $phpUnicodeBuilder = PHP::getBuilder(modifiers: 'u'); echo 'PHP (带u修饰符): /', $phpUnicodeBuilder->build($strings), "/u\n"; // JavaScript 默认处理 UTF-16,也需要 'u' 标志来正确处理 Unicode 码点 $jsBuilder = JavaScript::getBuilder(); echo 'JavaScript (无u标志): /', $jsBuilder->build($strings), "/\n"; $jsUnicodeBuilder = JavaScript::getBuilder(flags: 'u'); echo 'JavaScript (带u标志): /', $jsUnicodeBuilder->build($strings), "/u\n";
这正是解决复杂路由问题时最强大的功能之一。你可以将输入定义为字面量字符串和
s9e\RegexpBuilder\Expression
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use s9e\RegexpBuilder\Builder;
use s9e\RegexpBuilder\Expression;
use s9e\RegexpBuilder\Factory\PHP;
use s9e\RegexpBuilder\GroupType;
// 辅助函数,创建 Expression 实例
function expr(string $expr)
{
return new Expression($expr);
}
$delimiter = '~'; // 使用波浪号作为正则分隔符
$builder = PHP::getBuilder(delimiter: $delimiter);
// 设置为非捕获组,且重置组编号,方便路由匹配
$builder->serializer->groupType = GroupType::NonCaptureReset;
// 定义路由模式,混合了字面量和正则表达式
$routes = [
['/', expr('(*:home)')],
['/admin', expr('(*:admin_index)')],
['/admin/login', expr('(*:admin_login)')],
['/admin/product/', expr('(\d+)'), expr('(*:admin_product_show)')], // 动态ID
['/shop', expr('(*:shop_index)')],
];
$regexp = $builder->build($routes);
$finalRegexp = $delimiter . '^' . $regexp . '$' . $delimiter; // 添加起始和结束锚点
echo "生成的路由正则表达式:\n$finalRegexp\n\n";
// 测试路由匹配
$url = '/admin/product/123';
if (preg_match($finalRegexp, $url, $matches)) {
echo "匹配成功!\n";
print_r($matches);
} else {
echo "匹配失败。\n";
}这个例子展示了如何为复杂的 URL 路由生成一个单一的、高效的正则表达式。
(*:name)
s9e/regexp-builder
s9e/regexp-builder
s9e/regexp-builder
以上就是如何高效构建复杂正则匹配模式?s9e/regexp-builder助你轻松搞定!的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号