如何为现有简易PHP路由系统添加动态参数匹配功能
解决方案
你之前实现失败的核心原因有两个:
- 全等判断
===只能匹配固定字符串,无法匹配动态路由参数 - 直接给include的本地文件路径加
?param=xxx是无效的,PHP读取本地文件不会解析路径后的查询参数
修改后的完整路由代码
function router() { // 先给$page一个默认值,避免未定义报错 $page = null; // 固定路由匹配 if($url === '/login') { $page = '../private/login.php'; } else if($url === '/password-recovery') { $page = '../private/pass-rec.php'; } else if($url === "/password-reset") { $page = '../private/pass-reset.php'; } // 带参数的password-reset路由匹配 else if(preg_match('#^/password-reset/([a-zA-Z0-9]+)$#', $url, $matches)) { // 把捕获到的参数赋值给$_GET,和普通GET请求参数用法完全一致 $_GET['param'] = $matches[1]; $page = '../private/pass-reset.php'; } // 路由存在就引入,否则走404逻辑 if ($page && file_exists($page)) { include_once($page); } else { // 这里可以替换成你自己的404页面逻辑 http_response_code(404); echo "404 Not Found"; } }
代码说明
- 正则
#^/password-reset/([a-zA-Z0-9]+)$#解析:^匹配URL开头,避免路由前缀匹配([a-zA-Z0-9]+)捕获至少1位大小写字母/数字组成的参数,+限制最少1位,避免空参数匹配$匹配URL结尾,避免后缀多余字符匹配- 用
#做正则分隔符,避免路径里的/需要转义,可读性更高
- 捕获到的参数会存入
$matches[1],直接赋值给$_GET['param']后,你在pass-reset.php里可以直接和普通GET请求一样读取这个参数,不需要修改原有文件的参数读取逻辑
内容的提问来源于stack exchange,提问作者eskimopest
相关产品推荐
相关产品推荐

