我已经在一个花哨的路由器/调度员课上工作了几个星期,现在试图决定我想要它,我得到了完美的IMO,除了性能不是我想要的。它使用路线图arrap = / forums / viewthread /:id /:page => 'forums / viewthread /(?\ d +)'并通过我的地图数组循环使用正则表达式获得匹配,我想在高流量网站上获得更好的东西,这是一个开始......
$uri = "forum/viewforum/id-522/page-3";
$parts = explode("/", $uri);
$controller = $parts['0'];
$method = $parts['1'];
if($parts['2'] != ''){
$idNumber = $parts['2'];
}
if($parts['3'] != ''){
$pageNumber = $parts['3'];
}
我需要帮助的地方有时候一个id和一个页面在某个时候不会出现,有时两者都有,所以我的上面的代码显然不会覆盖它,它假设数组项2总是id而3总是页面,有人可以告诉我一个实际的方法,只有当它们存在于URI中而不使用正则表达式时,才能将页面和id匹配到变量吗?
到目前为止,您可以在此问题Is this a good way to match URI to class/method in PHP for MVC
中查看我的正则表达式版本答案 0 :(得分:1)
if ( ! empty($parts['2']))
{
if (strpos($parts['2'], 'id-') !== FALSE)
{
$idNumber = str_replace('id-', '', $parts['2']);
}
elseif (strpos($parts['2'], 'page-') !== FALSE)
{
$pageNumber = str_replace('id-', '', $parts['2']);
}
}
为$ part [3]
做同样的事情答案 1 :(得分:1)
这似乎更容易扩展:
$parts = explode("/", $uri);
$parts_count=count($parts);
//set default values
$page_info=array('id'=>0,'page'=>0);
for($i=2;$i<$parts_count;$i++) {
if(strpos($parts[$i],'-')!==FALSE) {
list($info_type,$info_val)=explode('-',$parts[$i],2);
if(isset($page_info[$info_type])) {
$page_info[$info_type]=(int)$info_val;
}
}
}
然后只使用$ page_info值。您可以通过这种方式轻松添加其他值以及更多级别的'/'。