用于创建可选Route参数PHP的解决方案

时间:2015-11-22 07:09:01

标签: php regex routes

我为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;对某事,但我不能。有人帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您可以使用this来匹配:\/\{(\w+)(\?)?\}

这将匹配任何/{param}/{param?}。你会检查&#39;?&#39;被捕获以检查它是否可选。

该表达式将匹配仅包含字母的参数,您可以通过执行以下操作轻松扩展它以获取您想要的任何字符:\/\{([a-zA-Z0-9\-\_])(\?)?\}