Url路由正则表达式帮助


Url routing regex help

我正在尝试为我的新CMS创建一个url路由脚本,但必须承认正则表达式不是我的强项。到目前为止,我一直遇到错误或没有结果。

我想要完成的是使用某些标签,如:id :year :slug等…

有没有人可以帮助我或引导我到正确的方向与此,那就是如何使用preg_match或类似的功能来找到正确的"url模式"?S

添加

示例url http://www.mysite.com/post/2011/08/15/title-of-a-blogg-post/

如果我有一个路由数据库和一个模式是例如post/:year/:month/:day/:slug,我希望它匹配这个模式,并调用一个特定的控制器,动作和在这个例子中一个特定的文章。

我创建的regex数组看起来像

$patterns = array(
    ":id"               => "/^[0-9]*$/",
    ":year"             => "/^([0-9]{4})*$/",
    ":year_short"       => "/^([0-9]{2})*$/",
    ":month"            => "/^([0-9]{2})*$/",
    ":day"              => "/^([0-9]{2})*$/",
    ":slug"             => "/^[a-zA-Z0-9 -]*$"
); 

我认为我需要将:id替换为/^[0-9]*$/,然后运行preg_match以查找url模式是否存在于我的路由表中。然而,我不知道我是否使用正确的正则表达式模式或只是完全丢失。

我的.htaccess文件是(因为我需要使用$_GET)

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

我使用这个基本上是获取url,并省略$_GET变量。

$route_orginal = trim($_SERVER["REQUEST_URI"]);
if(strpos($route_orginal, "?")!=FALSE) {
       list($route_orginal, $get_orginal) = explode("?", trim($_SERVER["REQUEST_URI"]));
}
if( substr($route_orginal,(strlen($route_orginal)-1),strlen($route_orginal)) == "/") {
        $this->routes = substr($route_orginal,1,(strlen($route_orginal)-2));
} else {
    $this->routes = substr($route_orginal,1,strlen($route_orginal));
}

我不知道你想要完成什么。

但是如果你想要一个URL,比如www.mysite.com/tags/id-year-slug

中每个标签用连字符分隔,你可以这样做:

首先,你需要在根目录下创建一个.htaccess文件来创建漂亮的url。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/tags/([A-Za-z-]+)$ index.php?tags=$1 [L,QSA]

然后在索引中,用-分隔符分隔标签:

$tags = explode('-',$_GET['tags']);

现在你有了一个标签数组,你可以在sql和url中使用它-击掌!