我目前正在做的是:
我有一个$path
变量,它是 index.php / (我用.htaccess隐藏)之后的所有内容,最多都是一个问号,忽略了查询字符串。
然后我在该变量上使用switch
preg_match
个案例来确定它应调用的脚本。例如:
switch (true)
{
case preg_match('{products/view/(?P<id>\d+)/?}', $path, $params):
require 'view_product.php';
break;
...
default:
require '404.php';
break;
}
这样我就可以使用$params['id']
访问产品ID,如果需要,可以使用查询字符串进行过滤,分页等。
这种方法有什么问题吗?
答案 0 :(得分:3)
你不应该像这样使用switch
。
更好地使用数组和foreach
之类的:
$rules = array(
'{products/view/(?P<id>\d+)/?}' => 'view_product.php'
);
$found = false;
foreach ($rules as $pattern => $target) {
if (preg_match($pattenr, $path, $params)) {
require $target;
$found = true;
break;
}
}
if (!$found) {
require '404.php';
}
答案 1 :(得分:0)
错误的部分是开关盒。作为一种更好的做法,我建议你将所有正则表达式存储到一个数组中并用它进行测试。将路由保存到配置文件,或者ini文件或数据库或xml或者其他任何会使您长期生活更轻松(如果您需要编辑/添加/删除新路由)将更容易。
在第二部分你可以使用parse_url php函数代替正则表达式,这会让你的脚本速度变慢。