php主流框架均支持通配符路由匹配动态url路径:laravel用{}定义参数并支持正则约束;thinkphp6用:前缀标识变量;slim用{}并通过getattribute获取;codeigniter4用()配合$1等占位符;原生php可结合parse_url与preg_match实现。

如果您在PHP框架中需要匹配动态变化的URL路径,例如用户ID、文章标题等不确定长度和内容的部分,则需借助通配符路由机制实现灵活的路径捕获。以下是几种主流PHP框架中配置通配符路由的具体方法:
一、Laravel框架中的通配符路由
Laravel使用花括号{}定义通配符参数,支持必填与可选两种形式,并可通过正则约束限定匹配规则。该方式将URL片段直接注入控制器方法参数,便于后续处理。
1、在routes/web.php中添加带通配符的GET路由:
Route::get('/user/{id}', [UserController::class, 'show']);
2、为通配符添加正则约束以限制匹配范围:
Route::get('/post/{slug}', [PostController::class, 'show'])->where('slug', '[A-Za-z0-9-_]+');
立即学习“PHP免费学习笔记(深入)”;
3、配置可选通配符(需设置默认值):
Route::get('/search/{keyword?}', [SearchController::class, 'index'])->defaults('keyword', 'all');
二、ThinkPHP6中的通配符路由
ThinkPHP6采用冒号:前缀标识动态变量,支持在route.php中声明并绑定到控制器方法。其通配符默认允许任意字符,但可通过闭包验证或中间件进一步过滤。
1、在app/route/route.php中注册通配符路由:
Route::get('article/:id', 'index/article/read');
2、使用正则表达式限定通配符内容:
Route::get('user/:uid\d+', 'index/user/info');
3、配置多级通配符路径:
Route::any('api/:version/:controller/:action', 'api/Api/index');
三、Slim Framework中的通配符路由
Slim使用花括号{}定义路由参数,通过$request->getAttribute()获取捕获值。其通配符匹配基于PSR-7标准,适用于轻量级API开发场景。
1、定义单个通配符路由:
$app->get('/book/{id}', function ($request, $response, $args) { ... });
2、定义多个连续通配符:
$app->get('/admin/{resource}/{id}', function ($request, $response, $args) { ... });
3、为通配符指定正则模式(避免匹配斜杠):
$app->get('/file/{name:[a-zA-Z0-9_\-\.]+}', function ($request, $response, $args) { ... });
四、CodeIgniter4中的通配符路由
CodeIgniter4使用圆括号()包裹通配符段,并在路由映射中通过$1、$2等占位符引用。该机制依赖于底层PCRE正则引擎,支持复杂路径模式识别。
1、在app/Config/Routes.php中配置带括号的通配符:
$routes->add('product/(:num)', 'Product::view/$1');
2、匹配字符串型通配符并传递至方法:
$routes->add('profile/(:any)', 'User::profile/$1');
3、组合多个通配符并设定优先级顺序:
$routes->add('api/v(:num)/(:any)/(:segment)', 'Api::handle/$1/$2/$3');
五、自定义正则通配符路由(原生PHP实现)
当不使用框架时,可通过parse_url()与preg_match()手动解析URL并提取通配符部分。此方式完全可控,适合嵌入式系统或极简架构。
1、获取当前请求URI路径:
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
2、使用正则匹配预设通配符模式:
if (preg_match('#^/user/(\d+)$#', $uri, $matches)) { $userId = $matches[1]; }
3、支持多模式分支判断:
elseif (preg_match('#^/post/([a-z0-9\-]+)$#i', $uri, $matches)) { $slug = $matches[1]; }










