从包含命名子模式的正则表达式字符串构建URL

时间:2010-09-26 15:53:10

标签: 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();
            $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正则表达式中的变量。

有一种简单的方法吗?

任何正确方向的建议或指示都会很棒。

1 个答案:

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

现在按预期工作