当前位置: 首页 > 后端技术 > PHP

FastRouteTestDemo

时间:2023-03-29 23:20:39 PHP

FastRouteTestDemoWithPHPWebsite:FastrequestrouterforPHPPregRoute.class`['handler0',['name','id']],#/user/tom/1regex=>/user/([^/]+)/(\d+)3=>['handler1',['id']],#/user/1regex=>/user/(\d+)4=>['handler2',['name']],#/user/tomregex=>/user/([^/]+)];/**基于计数的匹配*@varstring多路由匹配规则*/protected$combined_count_regex="~^(?|/user/([^/]+)/(\d+)|/user/(\d+)()()|/user/([^/]+)()()())$~x";/**基于计数匹配,只修改?:*@result替换?:为?|组号可以重新设置,但是*|/用户/(\d+)*|/user/([^/]+)的计数是一样的,用()填数,或者用其他方法,比如*/user/(\d+)*/user/([^/]+)*@varstring*/protected$combined_count_regex2="~^(?|/user/([^/]+)/(\d+)|/user/(\d+)|/user/([^/]+))$~x";/**计数匹配数据*@vararray*/protected$route_data_count=[3=>['handler0',['name','id']],#/user/tom/1regex=>/user/([^/]+)/(\d+)4=>['handler1',['id']],#/user/1regex=>/user/(\d+)5=>['handler2',['名称']],#/使用r/tomregex=>/user/([^/]+)];/**块正则表达式*@vararray*/protected$combined_count_regexes=[];/**块正则表达式数据*@vararray*/protected$route_data_counts=[];/**基于位置的调度路由*@param$url*@way基于组位置的非分块*@result在单个占位符的情况下提供相当好的性能*placeholder如果字符太多,在最坏的情况下(lastroutematch),性能下降到比普通方法慢两倍以上*@returnarray*/publicfunctiondispatchPosition($url){if(!preg_match($this->combined_position_regex,$url,$matches)){返回[self::NOT_FOUND];}//$i找到第一个非空偏移量并找到相关数据后,//可以继续遍历$matches数组,将值与变量名配对,填充占位符变量for($i=1;''===$matches[$i];++$i);list($handler,$varNames)=$this->route_data_position[$i];$变量=[];foreach($varNamesas$varName){$vars[$varName]=$matches[$i++];}返回[self::FOUND,$handler,$vars];}//++++++++++++++++++++++++++++++++++++++++//组号重置://PCRE正则表达式语法://(?|...)是非捕获组类型。//(?:和(?|之间的区别后者将在它包含的每个分支中重置组号//++++++++++++++++++++++++++++++++++++++++/**基于计数的调度路由*@param$url*@returnarray*/publicfunctiondispatchCount($url){if(!preg_match($this->combined_count_regex,$url,$matches)){return[self::NOT_FOUND];}列表($handler,$varNames)=$this->route_data_count[count($matches)];$vars=[];$i=0;foreach($varNamesas$varName){$vars[$varName]=$matches[++$i];}return[self::FOUND,$handler,$vars];}/**调度路由基于计数,非()占位符*@param$url*@returnarray*/publicfunctiondispatchCount2($url){if(!preg_match($this->combined_count_regex2,$url,$matches)){return[self::NOT_FOUND];}var_dump($matches);}/**块正则表达式调度*@param$url*@returnarray*/publicfunctiondispatchBlock($url){foreach($this->combined_count_regexesas$i=>$regex){if(!preg_match($regex,$url,$matches)){继续;}list($handler,$varNames)=$this->route_data_counts[$i][count($matches)];$变量=[];$i=0;foreach($varNamesas$varName){$vars[$varName]=$matches[++$i];}返回[self::FOUND,$handler,$vars];}}//+++++++++++++++++++++++++++++++++++++++++//组合的正则表达式方法适用于少量正则表达式,//但如果涉及许多正则表达式,则效果不佳,如果每个规则有多个捕获组,则将是灾难性的//可以通过仅组合大约十个表达式的块来提高性能。//这样不仅总体上提升了性能,也解决了multi-group情况下性能特别差的问题。//一旦你开始使用分块,基于组计数的替代方案不会有太大的不同。//捕获组越少情况越差,捕获组越多情况越好。特别是对于路由,每条路由通常涉及多个占位符,基于组计数的方法似乎更可取。//另一方面,对于词法分析,通常每个标记只使用一个捕获组,因此基于位置的方法更胜一筹。//+++++++++++++++++++++++++++++++++++++++++++}$testClass=newPregRoute();$url='/用户/汤姆';#/用户/1|/user/tom/1$dispatchPosition=$testClass->dispatchPosition($url);$dispatchCount=$testClass->dispatchCount($url);var_dump($dispatchPosition);var_dump($dispatchCount);`