我为我的PHP应用程序创建了Route类。一切正常,这是我的功能调度:
public function dispatch()
{
//some code...
$search = array();
$regex = preg_replace_callback(
'#{([w]+)?(:([^/()]*))?}#',
function($m) use (&$search) {
$search[$m[1]] = null;
if (isset($m[3])) {
return '(?P<'.$m[1].'>'.$m[3].')';
}
return '(?P<'.$m[1].'>[^/?]+)';
},
str_replace(array(')','/+'), array(')?','(/?|/.*?)'), $pattern)
);
$regex .= ($last === '/') ? '?' : '/?';
$regex = '#^'.$regex.'$#i';
if (preg_match($regex, $url, $matches)) {
// some code...
}
// some code...
}
现在,我可以使用这样的路线:
$router = new Router();
$router->add('/', function() {
echo 'Homepage';
});
$router->add('/user/{id}', function($id) {
echo 'User ID: ' . $id;
});
可选路线:
$router->add('/user(/{id})', function($id) {
echo 'User ID: ' . $id;
});
它可以工作,但我想将语法从"/user(/{id})"更改为"/user/{id?}",我该怎么做?我想也许可以将正则表达式"#{([\w]+)?(:([^/()]*)?}#"更改为某些内容,但我做不到。有人帮我吗?
您可以使用它来匹配以下任一项:/{(w+)(?)?}
。
这将匹配任何/{param}
或/{param?}
。你会检查"?"被捕获以检查它是否是可选的。
该表达式将匹配仅包含字母的参数,您可以通过执行以下操作轻松地将其扩展为您想要的任何字符:/{([a-zA-Z0-9-_])(?)?}