网址正则表达式帮助

时间:2011-08-15 08:47:08

标签: php regex url-routing

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

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

有人可以帮助我或引导我走向正确的方向吗,那就是如何使用preg_match或类似功能找到正确的“网址模式”?谷歌一次没有做到这一点:S

ADDED

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

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

我创建的正则表达式数组看起来像

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

1 个答案:

答案 0 :(得分:1)

我不确定你想要完成什么。

但是如果你想要一个像www.mysite.com/tags/id-year-slug这样的网址

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

首先,您需要在根目录中使用.htaccess文件来创建漂亮的网址。

RewriteEngine On

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

然后在索引中,您通过 - delimiter:

分解标记
$tags = explode('-',$_GET['tags']);

现在你有一个标签数组,你可以用它们的sql和url很漂亮 - 高五!