2010-09-26 28 views
2

这里是我用此刻的match_url功能构建url包含命名的子模式

function match_url($urls,$url) { 
    foreach($urls as $regex=>$args) { 
     $r = str_replace('/','\/',$regex); 
     preg_match("/$r/i",$url,$matches); 
     if(count($matches) > 0) { 
      $dispatch = array(); 
      $args['args'] = array(); 
      if(empty($args) && !empty($matches['controller'])) { 
       $dispatch['controller'] = $matches['controller']; 
       $dispatch['action'] = $matches['action']; 
      } else { 
       foreach($matches as $k=>$v) { 
        if(is_string($k)) { 
         $args['args'][$k] = $v; 
        } 
       } 
       $dispatch = $args; 
      } 

      return $dispatch; 
     } 
    } 
} 

这里有一些例子$网址

$urls = array(
    'articles/(?P<year>\d{4})' => array('controller'=>'articles','action'=>'show','name'=>'article_view'), 
    'admin/(?P<controller>[-\w]+)/(?P<action>[-\w]+)' => array(), 
    '(?P<controller>[-\w]+)/(?P<action>[-\w]+)' => array() 
); 

以下网址的文章/ 2010将返回像数组:

Array 
(
[controller] => articles 
[action] => show 
[name] => article_view 
[args] => Array 
(
[year] => 2010 
) 

) 

可正常工作,但现在我想创建一个函数使得w生病让我从给定的网址名称和参数建立一个网址。例如:

$name = "article_view"; 
$args = array("year"=>2010); 
echo url_for($name,$args); 
//should output articles/2010 

说我有是搞清楚如何我可以从URL的正则表达式与传递ARGS替代变量麻烦的一部分。

有没有一个简单的方法来做到这一点?

在正确的方向任何建议或指针会很好。

回答

2

这里是我想出了解决方案:

function url_for($urls,$name,$args) { 
    $url = ""; 
    foreach($urls as $k=>$v) { 
     if(!empty($v['name']) && $v['name'] == $name) { 
      $url = $k; 
      foreach($args as $key=>$value) { 
       $url = preg_replace("/\(\?P\<$key\>(.*)\)/",$value,$url); 
      } 
     } 
    } 
    return $url; 
} 

现在工作如我所料