Php 从包含命名子模式的正则表达式字符串生成url

Php 从包含命名子模式的正则表达式字符串生成url,php,regex,Php,Regex,下面是我目前正在使用的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(

下面是我目前正在使用的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;
        }
    }
}
下面是一些示例$URL

$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()
);
这就像预期的那样工作,但现在我想创建一个函数,允许我从给定的url名称和参数构建url。例如:

$name = "article_view";
$args = array("year"=>2010);
echo url_for($name,$args);
//should output articles/2010
我遇到的问题是如何用传递的参数替换url正则表达式中的变量

有没有一种简单的方法可以做到这一点


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

以下是我提出的解决方案:

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;
}
($url、$name、$args)的函数url\u{ $url=”“; foreach($k=>$v的URL){ 如果(!empty($v['name'])&&$v['name']==$name){ $url=$k; foreach($args作为$key=>$value){ $url=preg\u replace(“/\(\?P\(.*)\)/”,$value,$url); } } } 返回$url; } 现在它的效果和我预期的一样

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;
}