多层面包屑页面复杂url参数的一个处理小经验 [ 未指定版本 ]
业务逻辑比较复杂的页面设计时,通常用面包屑的方式增加UX。特别是分页的gridview过滤后表格的下级页面,并且该页面又有tab等a标签的url。经分析后会发现,大多数情况实际上不需要从头构建这些href,简单地替换或者去掉原url中的&key=value
或者?key=value
即可。理论上可有正则替换、用array_merge等实现方法,本例用正则替换。
欢迎扔砖,欢迎改进。废话到此,直接上函数:
/**
* url替换参数:
* a) 替换原来的参数: $url_in有$key时
* b) 添加新参数: $url_in中没有$key时
* c) 丢弃指定的参数: $drop为true时
* 需要考虑?key=value,以及&key=value两种情况。
* @param str $url_in 原来的url
* @param str $key 参数的key
* @param str $value 参数的value
* @param boolean $drop 是否丢弃这个key,为true时,返回结果中不包含这个key,$value被忽略
* @return str 新的url
*/
public static function urlReplaceParam($url_in, $key, $value, $drop=false)
{
# $key=开始除了'&'外的任意字符,以'&结尾'。注:如果用'.'表示任意字符,则直接匹配到末尾的&
$pattern1 = "/&$key=[^&]+&/";
# ?key=开始除了'&'外的任意字符,以'&结尾'。注:如果用'.'表示任意字符,则直接匹配到末尾的&
$pattern2 = "/\?$key=[^&]+&/"; // '?'要转义
$newparam1 = (!$drop)? "&$key=$value&" : "&";
$newparam2 = (!$drop)? "?$key=$value&" : "?";
$url_out = preg_replace($pattern2, $newparam2, $url_in.'&'); // 替换 ?key=value为新的内容
if ($url_out != $url_in.'&'){
return preg_replace("/[&|\?]$/", "", $url_out); // 有替换发生,去掉结尾的&或者?, 返回
}
$url_out = preg_replace($pattern1, $newparam1, $url_in.'&'); // 替换 &key=value为新的内容
if ($url_out != $url_in.'&'){
return preg_replace("/[&|\?]$/","",$url_out); // 有替换发生,去掉结尾的&或者?,返回
}
# 无替换,说明是新加的参数, 或者替换后和原来的值一样
if (strstr($url_out, $key)){
# 替换后和替换前一样,返回
return preg_replace("/[&|\?]$/","",$url_out);
}
if (!$drop){
if (strstr($url_in, '?')) {
$url_out = $url_in . "&$key=$value";
}else{
$url_out = $url_in . "?$key=$value";
}
}
return preg_replace("/[&|\?]$/","",$url_out); // 有替换发生,去掉结尾的&或者?,返回
}
该函数设计成一个叫Misc的helper类的静态函数,调用示例:
# 取url中的过滤条件
$flt = yii::$app->request->get('flt','all');
# 生成tab过滤的href
$prevurl = Yii::$app->request->getUrl();
$flta = Misc::urlReplaceParam($prevurl,'flt','',true);
$fltu = Misc::urlReplaceParam($prevurl,'flt','unused');
$fltp = Misc::urlReplaceParam($prevurl,'flt','pic');
$fltv = Misc::urlReplaceParam($prevurl,'flt','video');
$fltt = Misc::urlReplaceParam($prevurl,'flt','text');
性感的农民 雌都
注册时间:2014-10-29
最后登录:2020-09-02
在线时长:88小时31分
最后登录:2020-09-02
在线时长:88小时31分
- 粉丝49
- 金钱7680
- 威望285
- 积分11410
共 0 条评论