一种根据URL参数条件动态生成URL的方法

URLSearchParams 解析 URL 地址栏参数详解 是 ES6 中新增的一个用于处理 URL 查询参数的接口,它可以解析 URL 中的,并提供一系列方法来进行增删改查等操作。它主要用于的解析,也可以处理动态生成的 URL。是一个强大的工具,用于解析和处理 URL 查询参数。在开发中,利用可以让我们轻松完成 URL 参数的增删改查操作,简化代码逻辑。希望本教程能帮助你掌握的使用方法,提高项目开发效率! 阅读详情

最近做了一个产品列表页类似于搜索列表页, 功能比较简单,比搜索页复杂的逻辑在于,生成各个查询条件的URL。
我们的链接如下:

http://xxx.xxx.xxx/product/list.html?spm=0.0.0.0.fCULEV&noHistoryApi=1&q=洗衣机&start_price=1300&end_price=2300&ppath=6560:98950,2814486;570:24403,2085950&sort=sort-fid&fid=3486
一些特点如下:
alt

比如品牌部分:

1:三洋的链接中,要在ppath现有的基础上去掉中的6560:98950

2:海尔的链接中,要在ppath现有的基础上增加6560:105540
同理在:
alt
这部分,都有做ppath的调整。

而对价格部分

1:1300-2300的选项,点击这项是,要在现有的url中去掉start_price和end_price方法。

2: 选择其他价格时,要把start_price和end_price调整为对应的价格。
alt
再比如这部分:

1:分类筛选部分,去过去掉三洋,迷你部分的筛选,都要去掉相关的筛选项,构建url。

2:比如点击 能耗低,需要把url中的去掉sort=sort-fid&fid=3486,而点击省水时,需要把fid调整为3386,如选择人气和销量时,需要把sort修改为static-score,并把fid去掉。

以上这些组合链接,还要加上分页的s参数变化,当修改为查询条件时,分页页码s,也要删除。

总结下:生成链接中,主要工作是从现有的URL逻辑中删除掉一些参数,或加上一些参数,或者修改某些参数中的一些参数。其中最复杂的是ppath,ppath要支持5670:1234,123;5690:xxx,xxx,需要支持:和,两种形式的组合,而这些组合要支持加减操作。

根据这些规则,我们封装了一个方法build_url_param,需要修改url部分,调用这个方法即可。

 <li class="item">
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>">
 <?php }else{?>
 <li class="item-hidden">
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid']),'+');?>">
 <?php
     }}else{
 ?>
 <li class="item-checked">
 <a href="<?php echo THING_COMMENT_LIST.'&'.build_url_param(array('ppath'=>$inValue['pid'].':'.$inValue['vid'],'s'=>''),'-');?>">
 <?php } // end if?>

代码如上,build_url_param 构建查询url的参数部分,build_url_param第一个参数,传递一个数组,数组中传递相关参数,第二个参数"+"或者"-",“+”表示在现有URL中,加上第一个参数array中的key和对应的value;“-”表示从现有的URL中,减去第一个参数array中对应的key和value,使用以上方法后,所有生成url的部分,就变得非常简单了,只有知道当前连接,需要调整那些参数,是新增参数还是去掉参数即可。

build_url_param函数的实现如下:

/**
 * 根据QUERY构建url
 * $array: 传递参数,
 */

function build_url_param($array,$type){
    global $QUERY;

    $paramArray = array('q','start_price','end_price','cat','vid','ppath','sort','s','n','fid');

    $myArray = array();
    // 去掉不必要的参数
    foreach($paramArray as $key=>$value){
        // 放到myArray数组
        if(isset($QUERY[$value]) && !empty($QUERY[$value])){
            // n 不能小于10
            if($value == 'n'){
                if($QUERY[$value] < 10){
                    $myArray[$value] = '10';
                }
            }else{
                $myArray[$value] = $QUERY[$value];
            }
        }
    }
    // 构造最基本的
    if($type == '+'){
        // 加参数
        foreach($array as $key=>$value){
            $temp = array();
            // ppath特殊处理
            // pid相同时,pid:vid,vid; vid之间用,分割
            // pid不同时,pid:vid;分割
            // $value参数: pid:vid的形式
            if($key == 'ppath' && !empty($myArray[$key])){
                // 查找是否已经有此pid 
                $temp = $myArray[$key]; // 数组中的ppath
                $tempArray = explode(";",$temp);
                $tempPids = array();
                foreach($tempArray as $k=>$v){
                    list($tempPid,$tempVid) = explode(":",$v);
                    $tempPids[] = $tempPid;
                }
                $valueArray = explode(":",$value);
                // 找到
                if(isset($valueArray[0]) && stristr($temp,$valueArray[0]) != false && in_array($valueArray[0],$tempPids)){
                    $myArray[$key] = str_replace($valueArray[0].":",$value.",",$myArray[$key]);
                }else{
                    // 没有找到直接增加
                    $myArray[$key] = $myArray[$key].";".$value;
                }
            /*}elseif($key == 'fid'){
                if(!empty($myArray['fid'])){
                    $myArray['sort'] = "sort-fid";
                }
                $myArray[$key] = $value;
            */
            }elseif($key == 'sort'){
                unset($myArray['s']);
                $myArray[$key] = $value;
            }else{
                unset($myArray['s']);
                $myArray[$key] = $value;
            }
        }
    }else{
        // 减少参数
        foreach($array as $key=>$value){
            // 为空,去掉整个产生
            if(empty($value)){
                unset($myArray[$key]);
            }else{
                // 获取value
                $temp = $myArray[$key];
                // 单独处理ppath
                if($key == 'ppath'){
                    // 先找对应的pid,根据pid查找vid
                    if($value == $myArray[$key]){
                        unset($myArray[$key]);
                    }else{
                        // 数组,如果vid=0,删除所有的pid
                        $valueArray = explode(":",$value);
                        $ppathArray = explode(";",$myArray[$key]);
                        $t = array();
                        // ppath判断
                        if(isset($ppathArray[0])){
                            foreach($ppathArray as $inKey=>$inValue){
                                // 直接去掉
                                if($inValue != $value){
                                    //单条记录path
                                    $inValueArray = explode(":",$inValue);
                                    // pid相同
                                    if($inValueArray[0] == $valueArray[0]){
                                        // 删除vid
                                        $temp = str_replace(','.$valueArray[1],'',$inValueArray[1]); // 末尾
                                        $temp = str_replace(':'.$valueArray[1],'',$temp); // 开头
                                        $temp = str_replace($valueArray[1].',','',$temp); // 中间
                                        // 第二条件,用于删除所有pid下的所有数据
                                        if(!empty($temp) && $temp != $inValueArray[1]){
                                            // 删除后的数据进入t数组
                                            $t[] = implode(":",array($inValueArray[0],$temp));
                                        }
                                    }else{
                                        $t[] = $inValue;
                                    }
                                }
                            }
                        }
                        // 处理后的数组,赋值给ppath
                        if(count($t)){
                            $myArray[$key] = implode(";",$t);
                        }
                    }
                }else{
                    // 删除里面信息
                    $myArray[$key] = str_replace($value,'',$temp);
                }
            }
        }
    }
    // 构造一段param
    return http_build_query($myArray);
}


代码写的比较糙,有时间再细化下,关键是build参数的方式和方法希望对大家有所启发和帮助。

Python Django框架url反向解析实现动态生成对应的url链接示例 这篇文章主要介绍了Python Django框架url反向解析实现动态生成对应的url链接,结合实例形式分析了Django框架URL反向解析具体原理与应用操作技巧,需要的朋友可以参考下: url反向解析:根据url路由规则,动态生成对应的url链接 (防止硬编码)。 url反向解析应用在两个地方:模板中的超链接,视图中的重定向。 项目名/urls.py(项目的url路由配置,url反向解析,取... 阅读详情

相关推荐

动态URL与静态URL的区别及编程示例

动态URL适用于传递动态数据、灵活处理和呈现数据的场景,而静态URL适用于访问不会频繁改变的内容或资源的场景。动态URL和静态URL是两种常见的URL类型,它们在构成方式、特点和编程实现上存在一些区别。动态URL的生成是通过服务器端脚本或应用程序处理请求时动态生成的,因此每次请求可能会生成不同的URL。时,服务器会根据查询参数中的用户ID从数据库中检索相应的用户信息,并返回格式化后的用户数据。灵活性:动态URL允许根据需求动态生成不同的URL,从而实现更灵活的数据处理和呈现方式。在上面的示例中,当访问。

ByteKnight的博客 694

javascript:设置URL参数的方法,适合多条件查询

适用场景:多条件查询情况,如下图所示:  通过设置URL参数,再结合数据源控件设置的RUL参数,就能进行简单的多条件查询了。 javascript函数: &lt;mce:script type="text/javascript"&gt;&lt;!-- //设置URL参数的方法 function setParmsValue(parms, parmsV...

weixin_34247032的博客 278

Python Requests库:请求参数的动态生成方法

在Web开发和数据采集过程中,我们经常需要与各种API进行交互。不同的API可能要求不同的请求参数,而且这些参数可能会根据不同的条件动态变化。Python的Requests库是一个强大且易用的HTTP库,它使得发送HTTP请求变得非常简单。本文章的目的就是详细介绍如何使用Requests库动态生成请求参数,涵盖了常见的请求参数类型,如查询字符串参数、表单数据、JSON数据等。通过本文的学习,读者将能够掌握在不同场景下动态生成请求参数的方法,提高与API交互的效率和灵活性。

AI Python 编程之道的博客 1153

(重点)【MBG实战(下划线命名)】 1.crud 2.计数 3.自定义sql(my文件夹下) 4.分页插件PageHelper 5.解决重复生成xml报错问题 6.跳过指定单元测试

1.计数。

focus-unchanged-thing 867

Cadence Allegro 17.4学习记录开始02-原理图Capture CIS 17.4

Allegro的第一方网表与第三方网表有以下几个区别点;Ø 与Allegro实现交互式操作的是第一方网表,第三方网表时不可以实现交互式操作;Ø 第三方网表不能将器件的Value属性导入到PCB中,输出时以封装属性来代替Value属性,第一方网表是可以的;Ø 网表导入到PCB中时,第三方的网表需要指定事先指定好PCB封装库文件,并产生Device文件,才可以将网表导入到PCB中,第一方网表则可以直接导入。

qq_31444421的博客 1万+

PROFINET方案选型指南:瑞萨/西门子/开源p-net协议栈对比实测

本文基于瑞萨RZ/N2L硬件平台,对瑞萨官方认证协议栈、西门子ERTECH及开源p-net三种PROFINET方案进行了实测对比。重点分析了PROFINET-IRT实时性、CPU/内存资源消耗、开发集成复杂度及许可证成本等核心指标,为工业设备制造商提供了从性能到商业决策的全面选型指南。

weixin_29291185的博客 209

JS逆向实战案例1——某房地产url动态生成

JS逆向实战案例1——某房地产url动态生成

zhu6201976的博客 1977

利用树莓派制作智能音箱

利用树莓派制作智能音箱

qq_61803022的博客 1777

ASP.NET MVC3 学习心得------路由机制

9.1 理解URL URL满足的要求: l 域名易于记忆和拼写 l 简短、易输入 l 可以反应出站点的结构 l 可破解,用户可以通过移除URL的末尾,进而达到更高层次的信息体系结构 l 持久、不能变化 9.2路由机制的概述 ASP.NET MVC中路由机制的两种用途: l 匹配传入的请求,并映射到控制器的操作 l 构造传出的URL,用来相应控制器的操

xuemoyao的专栏 3705

Super4PCS文章阅读笔记

Super4PCS阅读笔记 Super4PCS阅读笔记 前言 前言 今天给大家分享一下点云配准四点法4PCS0的变种——Super4PCS。此算法的原文在:Super4PCS: Fast Global Pointcloud Registration via Smart Indexing。稍微我也会写一篇关于如何使用这篇文章的里所提供的代码进行点云粗配准。关于四点法...

Vodake的博客 4539

告别迷茫!用ETAS RTA-OS配置你的第一个AUTOSAR OS任务(含VRTA虚拟ECU实战)

本文详细介绍了如何使用ETAS RTA-OS工具链在VRTA虚拟ECU上配置和运行第一个AUTOSAR OS任务。通过从XML配置到任务调度的全流程实战,帮助开发者快速掌握嵌入式操作系统开发的核心步骤,特别适合刚接触AUTOSAR的开发者快速上手。

weixin_42533622的博客 418

去掉get方式的URL中空的参数

当然,用post提交就没有任何参数了,但这不符合HTTP的规范,查询嘛,就得用get方式才好,但是get方式不够智能,查询表单中用户可能一个条件也没设置,一点查询,URL上跟一大串空参数如"?a=&b=&user=&q="很难看,我希望实现:如果用户一个条件也没选,那URL后面什么参数也不带,如果选了某个参数,URL上只带这个参数,不带任何空值的参数。 我想,唯一的方式就是不使用form,而...

berg369的专栏 1050

MATLAB控制信号发生器(USB-GPIB-HS)GPIB仪器控制教程(含matlab代码)

自动化测试时需要自动产生信号,通过matlab控制信号发生器的频率与功率,以实现自动化信号生成输出

qq_43686057的博客 1606

Js 动态修改 url 的参数

URL链接:url = http://www.baidu.com?id={ID}&type={Type} DATA数据:param={ ID:“123421”, Type:“line” } Js代码如下: function changeLinkUrl(linkUrl,param){ //获取{}中的变量名称 var array = linkUrl.match(/{(.*?)}/g); if(array == null ){ return linkUrl; } //正则表达

悟●禅●酒的专栏 1086

手把手教你做基于stm32的红外、语音、按键智能灯光控制(上)

这次项目使用的板子是stm32f103c8t6最小系统板,这个板子在tb上都能够买到,随便一个最小系统板都可以,== 注意在买最小系统板的时候需要买一个stlink下载器来下载程序。显示模块是使用的0.96英寸的OLED屏幕,注意是使用的IIC通信协议的OLED屏幕,不是使用SPI总线协议的。这次写的代码还顺便集成了检测温湿度的功能,所以要使用DHT11温湿度传感器,来采集温度。本文所设计的基于单片机的灯光控制系统主要由模式选择功能、手动模式和自动模式组成。LED灯自然就是要控制的部件了。

nbbskk的博客 6557

【在 WSL2 GUI 中使用 pulseaudio 播放声音】

最近在搞一个Linux项目,由于WSL2中需要用到声音外放,无奈只能潜心研究。后来就使用了一种折中的方式替代,那就是pulseaudio。目前来讲WSL2对硬件外设的支持还是不太友好,关于USB的支持我之前在其他文章中已经论述过了,这里不讨论。1、Windows11别忘记打开声音2、可能有一定延迟,因为是通过网络传输的。3、效果的话只能见仁见智了,如果不能满足要求就安装一个实实在在的Ubuntu吧!

jiexijihe945的博客 4530

axios get请求动态拼接url

【代码】axios get请求动态拼接url。

vue+iview 动态渲染表格(vue.js结合iview插件) 385

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

hdwiki 学习笔记 01

一、href =“”里的参数写法 <!--{if $hotname[url]}-->{$hotname[url]} <!--{else}-->index.php?doc-innerlink-{eval echo urlencode($hotname[name])} <!--{/if}--> 二、 转载于:https://www.cnb...

weixin_30814329的博客 157

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

根据url动态生成二维码

根据url动态生成二维码的工具类,没有细研究,先贴出来,有兴趣自己深究。 public class QRCodeUtil { public static BufferedImage createImage(String content, String logoImgPath, boolean needCompress) throws IOException, WriterExcep...

qq_35701161的博客 849

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

js 拼接url和参数

class Url { /** * 传入对象返回url参数 * @param {Object} data {a:1} * @returns {string} */ getParam(data){ let url = ''; for(var k in data){ let value =...

sun 1万+

mockjs中根据请求参数动态生成模板

mockjs拦截get请求 这里由mockjs提供的options的参数中只能够获得url本身,并不能很好的直接获得get请求的参数。但是,通过querystring库的prase函数可以很好的解决这个问题。 由此就可获得get请求在url中的参数。 根据参数动态生成指定数量的列表(以分页为例) 通过使用JS提供的计算属性语法,可将变量设置为对象名。 ...

qq_43964025的博客 1200

vue 获取请求url_vue 获取url里参数的两种方法小结

vue 获取url里参数的两种方法小结我就废话不多说了,大家还是直接看代码吧~第一种:const query = Qs.parse(location.search.substring(1))let passport = query.passport;第二种:var query=this.$route.query;let lat = query.lat;补充知识:Vue通过query获取路由参数现在...

weixin_31263231的博客 1万+

在Power BI中根据用户选择动态生成带过滤条件的报表URL (Dynamic URL Link)

在Power BI中根据用户选择动态生成带过滤条件的报表URL (Dynamic URL Link)

Fluffy的百宝箱 7130

thinkphp 使用U方法自动生成URL超链接

ThinkPHP U方法 U 方法是 ThinkPHP 内置的一个快捷方法,可以根据系统 URL 模式配置动态的生成智能的 URL 地址。 由于 ThinkPHP 支持各种不同的 URL 模式,另外还有分组模式,因此当环境发生变化时,有时候可能会改变 URL 模式,而 U 方法正是解决不同配置情况下的 URL 统一问题。除了动态生成 URL 以自适应系统配置外,U 方法还有一个好处是可以自动

2万+

使用<jsp:include>,不想写死URL,动态生成URL的解决办法

http://dangry.iteye.com/blog/868422/

aty 4306
上一篇: 为 iPhone 和 iPad 自定义网站的主屏幕图标
下一篇: 一种加快在苹果app store中上架的方法
逸学堂
博客等级 码龄23年 1104粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值