我正在尝试为我的新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));
}
答案 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很漂亮 - 高五!