目前在做CMS内核,期间遇到一个有趣的问题,值得记录一下。
以日志页网址为例:http://localhost/topic?btime=1526807260&btid=2554
其中固定路由为:http://localhost/topic,配置变量为:?btime=1526807260&btid=2554
某些页面我想改变其中的一个参数,例如将btime调整为100,其余参数不变,生成新的URI地址。
目前常见的解决方法为将$_GET数组复制,变更其中某个参数,然后循环生成新的URI,类似于:
function uridis($act,$val){
$arr=$_GET;
$arr[$act]=$val;
$uri='';
foreach($arr as $key=>$row){$uri.='&'.$key.'='.$row;}
return $uri;
}
这种方法每调用一次函数就要复制一次$_GET数组,经历一次循环,效率非常低,还占用内存。
于是我修改为使用str_replace进行数组替换:
function uridis($act,$val){return trim(str_replace('&'.$act.'='.$_GET[$act].'&','&'.$act.'='.$val.'&','&'.$_SERVER['QUERY_STRING'].'&'),'&');
完善了一个正则表达式:
function uridis($act,$val){return preg_replace('/(^|&)'.$act.'\=(?:.*?)($|&)/i','\1'.$act.'='.$val.'\2',$_SERVER['QUERY_STRING']);