使用正则表达式将URL匹配到路由

时间:2014-04-18 21:17:34

标签: php regex url-routing

我有这样的路线(YAML):

hello_route:
    path: /hello
    controller: HelloController
    action: helloAction

这工作正常并调用正确的控制器和操作,但我很难匹配通配符。例如,如果我想添加:

hello_route:
   path: /hello/{name}
   controller: HelloController
   action: helloAction

我尝试使用正则表达式,但是当你在浏览器中输入/hello/bob时,无论我用正则表达式做什么,它一直说没有路由。如何使用regex将URI /hello/bob仍匹配/hello/{name}?截至目前,它确实在寻找明显/{name}

!= /bob

到目前为止,我正在使用此功能,因为我认为将{name}替换为*会使浏览器将其视为外卡。但这不起作用。

/**
 * Compiles routes
 *
 * @param  array $routes
 * @return string
 */
public function compileRoutes(array $routes)
{
    foreach($routes as $key => $val)
    {
        if($val['path'])
        {
            preg_match_all('/\{(\w+?)}/', $val['path'], $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);

            foreach ($matches as $match)
            {
                if(isset($matches[0]) && isset($matches[1]))
                {
                    $matches[0] = '*';
                    $val['path'] = $matches[0];
                    $this->params[] = $matches[1]; 
                }
            }
        }
    }

    $this->routes = $routes;
}

这是@Tuga的回报

/
/test
/hello/{name} <- not being replaced

1 个答案:

答案 0 :(得分:0)

我不知道你想要什么,但这个正则表达式的语法是错误的

\{(\w+?)}

它必须是这样的:

\{(\w+?)\}

或者这个:

(\w+?)