这是我目前正在使用的match_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
$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
)
)
这按预期工作但现在我想创建一个允许我从给定的url名称和args构建url的函数。例如:
$name = "article_view";
$args = array("year"=>2010);
echo url_for($name,$args);
//should output articles/2010
我遇到问题的部分是弄清楚如何用传递的args替换url正则表达式中的变量。
有一种简单的方法吗?
任何正确方向的建议或指示都会很棒。
答案 0 :(得分: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;
}
现在按预期工作