热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

thinkphp路由规则终极详解(附伪静态)-菜鸟必看-PHP源码

thinkphp路由规则终极详解(附伪静态)-菜鸟必看
http://my.oschina.net/u/1178986/blog/201206

//thinkphp 路由定义规则		
$route = array(
				'news/:action^delete|update|insert/:year\d/:month/:day'=>array('news/read?extra=:2&status=1','year=:2&mOnth=:3&day=:4'),
				'news/:action/:year\d/:month/:day'=>'news/read?year=:2&mOnth=:3&day=:4'
			  );

$url  = 'http://www.test.com/index.php/news/read/2012/2/21/extraparam/test.html';



//后缀名
$extension = 'html';



//根据pathinfo定义  详情看: http://my.oschina.net/u/1178986/blog/201206
//可知: $_SERVER['PATH_INFO'] = 'news/read/2012/2/21/extraparam/test.html';
$regx = 'news/read/2012/2/21/extraparam/test.html';

//循环匹配路由规则
foreach($route as $key=>$value){
		//如果匹配成功,则不继续匹配
		if(parseUrlRule($key,$value,$regx,$extension))
			break;
}



/**
 *  @$rule  string    路由规则   
 *  @$route string    规则映射的新地址
 *  @$regx  string    地址栏pathinfo字符串
 *  @$extension stirng  伪静态拓展名
 *  return  bool 
 */
function parseUrlRule($rule,$route,$regx,$extension=null){
		 //去掉后缀名
		 !is_null($extension) && $regx = str_replace('.'.$extension,'',$regx);

		 //把路由规则和地址,分割到数组中,然后逐项匹配
		 $ruleArr = explode('/',$rule);
		 $regxArr = explode('/',$regx);

		 //$route以数组的格式传递,则取第一个
		 $url = is_array($route) ? $route[0] : $route;
		 $match =true;

		 //匹配检测
		 foreach($ruleArr as $key=>$value){
		 		if(strpos($value,':')===0){
		 			if(substr($value,-2)=='\\d' && !is_numeric($regxArr[$key])){
		 				$match = false;
		 				break;
		 			}elseif(strpos($value,^_^ _^`)){
		 				$stripArr = explode('|',trim(strstr($value,^_^ _^`),^_^ _^`));
		 				if(in_array($regxArr[$key],$stripArr)){
		 					$match = false;
		 					break;
		 				}
		 			}
		 		//静态项不区分大小写
		 		}elseif(strcasecmp($value, $regxArr[$key])!==0)	{
		 			$match = false;
		 			break;
		 		}
		 }

		 //匹配成功
		 if($match){
		 		//把动态变量写入到数组$matches 中,同时去除静态匹配项
		 		foreach($ruleArr as $key=>$value){
		 				if(strpos($value,':')===0){
		 					//获取动态变量,作为数组下标
		 					if(substr($value,-2,1)=='\\')
		 						$matchKey = substr($value,1,-2);
		 					elseif($pos=strpos($value,^_^ _^`))
		 						$matchKey =substr($value,1,$pos-1); 
		 					else
		 						$matchKey = substr($value,1);

		 					$matches[$matchKey] = array_shift($regxArr);
		 				}else
		 					array_shift($regxArr);   //去除静态匹配项
		 		}


		 		//获取数组中的值,目的是配合子模式进行替换
		 		$values = array_values($matches);
		 		//正则匹配替换,正则需要用'e'作为修饰符
		 		$url = preg_replace('/:(\d+)/e','$values[\\1-1]',$url);

		 		//解析url    格式:  分组/模块/操作?key1=value1&key2=value2
		 		if(strpos($url,'?')!==false){   
		 			 // 分组/模块/操作?key1=value1&key2=value2
		 				$arr = parse_url($url);
		 				$paths = explode('/',$arr['path']);
		 				parse_str($arr['query'],$queryArr);
		 		}elseif(strpos($url,'/')!==false)  //分组/模块/操作)
		 				$paths = explode('/',$url);
		 		else 							// key1=value1&key2=value2
		 				parse_str($url,$queryArr);


		 		//获取 分组 模块 操作
		 		if(!empty($paths)){
		 				$var['actionName'] = array_pop($paths);
		 				$var['moduleName'] = array_pop($paths);
		 				if(!empty($paths)){
		 					$groupList = 'Home,Admin';
		 					$temp = array_pop($paths);
		 					if(in_array($temp,explode(',',$groupList)))
		 						$var['groupName'] = $temp;
		 				}
		 		}
		 		//合并的到GET数组中,方便全局调用
		 		$_GET = array_merge($_GET,$var);

		 		//合并参数
		 		if(isset($queryArr))
		 			$_GET = array_merge($_GET,$queryArr);

		 		//匹配url中剩余的参数
		 		preg_replace('/(\w+)\/([^,\/]+)/e','$tempArr[\'\\1\']=\'\\2\'',implode('/',$regxArr));
		 		if(!empty($tempArr))
		 			$_GET = array_merge($_GET,$tempArr);


		 		//route是数组的话
		 		if(is_array($route)){
		 				$route[1]=preg_replace('/:(\d+)/e','$values[\\1-1]',$route[1]);
		 				parse_str($route[1],$var);
		 				$_GET = array_merge($_GET,$var);
		 				strpos($url,'?')!==false ? $der ='&' : $der='?';
		 				//最终写入到$_GET中的参数,包括三个部分
		 				//1.地址栏剩余参数
		 				//2.路由地址中的参数
		 				//3.$route是数组时的第二个参数
		 				if(!empty($tempArr))
		 					$var = array_merge($tempArr,$var);
		 				$url .=$der.http_build_query($var);
		 		}
		 		$_GET['finalUrl'] = $url;
		 		//保证$_REQUEST 也能访问
		 		$_REQUEST = array_merge($_REQUEST,$_GET);
		 		//结果
		 		print_r($_GET);
		 		return true;
		 }
		 return $match;
}





//在部署时会把index.php隐藏,开启apache的重写模块
//重写规则 : RewriteRule  ^(.+)$  /index.php/$1 
//详细配置: http://lamp.linux.gov.cn/Apache/ApacheMenu/rewrite/
//开启后,apache会自动把 http:/www.test.com/news/read/2012/2/21/extraparam/test.html转换为 http:/www.test.com/index.php/news/read/2012/2/21/extraparam/test.html	

2. [图片] 搜狗截图14年02月21日1621_2.png


推荐阅读
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
author-avatar
咪咪的小天地计_395
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有