创建可选路由参数PHP的解决方案


Solution for create optional Route parameter PHP

我为我的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'-'_])('?)?'}