PHP MVC路由类部分带数字URL匹配失败问题修复
问题原因
- 直接诱因:你为
name段自定义的匹配正则是[a-z-]+,这个字符集仅允许小写英文字母和连字符(-),天然不包含下划线_和数字0-9,遇到title_34这类包含下划线、数字的字段自然会匹配失败。 - 底层隐患:路由类本身的默认参数匹配规则、参数名解析规则兼容范围过窄,就算不写自定义正则,参数包含下划线、数字时也会出现同类匹配失败问题。
修复方案
方案1:修改当前路由规则(快速修复当前问题)
直接调整name段的自定义正则,把需要支持的字符加入字符集即可,修改后的路由定义如下:
$r->add( 'view/view_profile/{id:\d+}/{name:[a-z0-9_-]+}', [ 'method' => 'GET', 'controller' => 'view', 'action' => 'view_profile' ] );
修改后的[a-z0-9_-]+规则可以匹配1个及以上的小写字母、数字、下划线、连字符,完全覆盖title_34这类格式的匹配需求。
方案2:修复路由类底层逻辑(一劳永逸解决同类问题)
需要修改Router类add方法的两处正则替换逻辑,可选修复请求方法判断的潜在bug:
第一步:调整默认无规则参数的匹配范围
找到add方法里替换通用变量的代码块:
// 原代码 // Convert variables e.g. {controller} $route = preg_replace('/\{([a-z]+)\}/', '(?P<\1>[a-z-]+)', $route);
替换为:
// 修复后:支持参数名包含下划线,参数值默认支持字母、数字、连字符、下划线 $route = preg_replace('/\{([a-z_]+)\}/', '(?P<\1>[a-z0-9_-]+)', $route);
这里做了两个改动:
- 参数名匹配规则从
[a-z]+改为[a-z_]+,支持类似{user_id}这类带下划线的参数名 - 参数值默认匹配规则从
[a-z-]+改为[a-z0-9_-]+,默认就支持数字、下划线,无需每次重复自定义正则
第二步:调整带自定义正则的参数名匹配规则
找到add方法里替换带自定义规则变量的代码块:
// 原代码 // Convert variables with custom regular expressions e.g. {id:\d+} $route = preg_replace('/\{([a-z]+):([^\}]+)\}/', '(?P<\1>\2)', $route);
替换为:
// 修复后:支持带下划线的自定义规则参数名 $route = preg_replace('/\{([a-z_]+):([^\}]+)\}/', '(?P<\1>\2)', $route);
修改后可正常解析{user_id:\d+}这类参数名带下划线的路由规则,不会出现解析失败问题。
可选修复:请求方法判断逻辑
当前match方法里的请求方法判断被注释,原有strstr判断存在误判风险,找到match方法里的对应代码:
// 原代码 $method = $params['method']; $reqMet = $_SERVER['REQUEST_METHOD']; //if ( strstr( $method , $reqMet ) && (preg_match($route, $url, $matches))) { if ( preg_match($route, $url, $matches)) {
替换为:
// 修复后:严格校验请求方法,增加默认值避免报错 $method = strtoupper($params['method'] ?? 'GET'); $reqMet = $_SERVER['REQUEST_METHOD']; if ( $method === $reqMet && preg_match($route, $url, $matches)) {
改动点:
- 给method参数增加默认值GET,避免未配置method字段时出现数组键不存在的报错
- 用全等判断替代strstr判断,避免方法名包含导致的误匹配(比如配置method为GETPOST时误匹配GET请求)
- 恢复请求方法校验,符合RESTful路由的设计逻辑
验证结果
修改完成后,以下URL都可以正常匹配:
view/view_profile/342/titleview/view_profile/23/more-stuffview/view_profile/342/title_34view/view_profile/123/test_123-abc
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

