我为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...
}
现在,我可以使用Route看起来像这样:
$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;
});
它正常运行,但我希望从&#39; / user(/ {id})更改语法&#39;到&#39; / user / {id?}&#39;,我该怎么做?我想也许可以改变正则表达式&#39;#{([\ w] +)?(:( [^ /()] *))?}#&#39;对某事,但我不能。有人帮帮我吗?
答案 0 :(得分:0)
您可以使用this来匹配:\/\{(\w+)(\?)?\}
。
这将匹配任何/{param}
或/{param?}
。你会检查&#39;?&#39;被捕获以检查它是否可选。
该表达式将匹配仅包含字母的参数,您可以通过执行以下操作轻松扩展它以获取您想要的任何字符:\/\{([a-zA-Z0-9\-\_])(\?)?\}