一种匹配路线的优雅方式

an elegant way to matching a route

我卡在了一段看起来很糟糕的代码上。

我得到了一条像 /people/12/edit 这样的字符串形式的路线,我想将它与我的数据集中的路线进行比较。 在数据集中有这样的路线:

我需要知道,我的路线 /people/12/edit 进入了 /people/:id/edit

的内部行动

所以我有以下条件来检查这个:

if(preg_match("/^".preg_replace('/:id/','([0-9]*)?',preg_replace('/\//','\/',$_route['route']))."$/", $route)){
    // ...
}

但这似乎是一个糟糕的解决方案。我必须转义斜杠,我必须替换 :id 参数,然后,我可以检查路由是否匹配。

但它看起来很糟糕并且有一个大问题。如果参数未命名 :id,它就不会工作。

你能给我一些提示或展示更好的方法吗?

提前致谢

更新: 我没有使用任何 mvc 框架。这是一个 "build your own framework and learn task"

路线中存储的路线 table:

people_index        get     /people         people#index
people_show     get     /people/:id         people#show
people_edit     get     /people/:id/edit            people#edit
people_update       put     /people/:id         people#update
people_new      get     /people/new         people#new
people_create       post        /people         people#create
people_delete       delete      /people/:id         people#delete

如果我调用 link_to 'people_index',它将显示 /people。上面的条件是路由解析器的一部分。它只是在寻找正确的 uri 和 return(用于编辑 link)people#edit。在此之后,我知道有一个资源 PeoplesController 并调用 edit 操作。

我知道 php 有很多很棒的 mvc 框架。但我想获得更多经验并将一些 rails 逻辑重建为 php :)

首先我会把它分成一些,最好以可重用的方式,说一个函数来首先解析映射。

function createpattern( $map ) {
       $map = preg_replace('/:id/', '([0-9]+|new)', $map );
       //add other mappings here for example.
       $map = preg_replace('/:name/', '([a-z])', $map );
      return $map;
}  

或者这部分只使用 rusty trusty str_replace。

function createpattern( $map ) {
      $search = array( ':id', ':name' );
      $replace = array( '([0-9]+|new)', '([a-z]+)?');
      $map = preg_quote($map); //maybe use it here.

      $map = str_replace($search,   $replace, $map );
      return $map;
} 

所以这个

 /people/:id 

变成

 /people/([0-9]+|new)

你应该在某个地方使用 preg_quote,但在添加 regx 位之后就不行了。

基本上你的正则表达式现在是

 \/people\/([0-9]+|new)\/... etc.

preg_quote 将用于防止用户添加自己的正则表达式并弄乱你的正则表达式,无论是无意还是其他。