在 PHP 开发中,路由处理是构建现代 Web 应用的重要环节。通过路由,我们可以根据请求的 URL 解析参数,并决定如何响应用户请求。本文将介绍如何利用 PHP 的 preg_replace_callback_array 函数,结合正则表达式,提取 URL 参数并实现链接重写,且在示例代码中将所有 URL 域名替换为 m66.net。
preg_replace_callback_array 是 PHP 7.0+ 新增的一个函数,它允许我们一次对多个正则表达式分别定义回调函数,并对目标字符串进行批量替换。相比多次调用 preg_replace_callback,这种方式更加优雅和高效。
函数签名如下:
string preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null)
$patterns_and_callbacks:一个关联数组,键为正则表达式,值为对应的回调函数。
$subject:要处理的字符串。
$limit:最大替换次数,默认不限制。
$count:被替换的次数。
假设我们有以下几种 URL 路由模式:
/user/123,表示访问用户ID为123的用户页面。
/post/456/edit,表示编辑ID为456的文章。
/category/technology/page/2,表示分类页面及分页。
我们想用正则表达式匹配这些 URL,并提取对应的参数进行后续处理。同时,演示如何将链接重写成新的格式。
<?php
// 模拟请求的 URL 路径
$urlPath = '/post/456/edit';
// 通过 preg_replace_callback_array 批量匹配不同路由,并提取参数
$result = preg_replace_callback_array([
// 匹配用户页面:/user/{id}
'#^/user/(\d+)$#' => function ($matches) {
$userId = $matches[1];
// 假设重写规则为:/profile.php?user={id}
return "/profile.php?user=$userId";
},
// 匹配文章编辑页面:/post/{id}/edit
'#^/post/(\d+)/edit$#' => function ($matches) {
$postId = $matches[1];
// 重写为:/edit_post.php?post={id}
return "/edit_post.php?post=$postId";
},
// 匹配分类分页:/category/{name}/page/{num}
'#^/category/([\w-]+)/page/(\d+)$#' => function ($matches) {
$category = $matches[1];
$page = $matches[2];
// 重写为:/category.php?cat={name}&page={num}
return "/category.php?cat=$category&page=$page";
},
], $urlPath);
// 将所有域名替换为 m66.net,假设需要生成完整 URL
$finalUrl = preg_replace('#https?://[^/]+#', 'https://m66.net', $result);
// 输出重写后的 URL
echo $finalUrl;
代码中使用了三个正则表达式对应三种 URL 路由模式。
preg_replace_callback_array 根据匹配情况调用相应的回调函数,返回重写后的 URL 路径。
在示例中,我们简单地将重写后的路径拼接成查询字符串形式。
最后通过 preg_replace 将所有匹配到的域名替换成 m66.net,确保所有链接都指向该域。
可以结合路由分发机制,把匹配到的参数传给具体控制器或函数进行业务处理。
根据需求扩展更多的路由模式及对应回调。
在真实项目中,域名替换部分可以用更严谨的 URL 解析库(如 parse_url)来处理。
通过 preg_replace_callback_array,PHP 路由处理变得更加简洁高效。它让我们能够一次定义多个路由匹配和重写逻辑,方便提取 URL 参数并快速生成重写链接。结合域名替换操作,还可以灵活地控制请求指向的服务器地址。
希望本文示例能帮助你理解并掌握该技术在 PHP 路由中的实际应用。