再加一个条件:
如果调用中包含空的值:
name1=xxx&name2=&name3=333
则返回的时候将其去掉:
name1=xxx&name3=333

解决方案 »

  1.   

    function modiUrl(str)
    {
    var re = /(\w+)=(\w+)/g; //分解参数用表达式
    var re1 = /(.+\/)([^\/]*)$/; //获取连接串2部分的表达式
    //re1 = /(.+)\?([^?]*)$/   //如果连接字符串不是"/"结尾 用这个;
    var bank = {}; //输入的参数集
    var bank1 = {}; //连接的参数集
    var arr = []; //重组连接参数缓冲用数组
    var url = ""; //连接字符串  
    var param = ""; //参数字符串 while(re.exec(str))bank[RegExp.$1] = RegExp.$2; //分析输入参数
    if(re1.test(location.href)) //分解连接字符串
    {
    url = RegExp.$1;
    param = RegExp.$2;
    }
    while(re.exec(param))bank1[RegExp.$1] = RegExp.$2;//分析连接字符串中的参数
    for(var o in bank)bank1[o] = bank[o]; //参数合并 以新代旧
    for(var o in bank1)arr[arr.length] = [o,"=",bank1[o]].join('');//参数重组
    param = arr.join('&');
    return [url,"?",param].join('');//合并连接字符串
    }
      

  2.   

    稍微优化了一下:少了一次遍历!
    function modiUrl(str)
    {
    var re = /(\w+)=(\w+)/g; //分解参数用表达式
    var re1 = /(.+\/)([^\/]*)$/; //获取连接串2部分的表达式
    //re1 = /(.+)\?([^?]*)$/   //如果连接字符串不是"/"结尾 用这个;
    var bank = {}; //参数集
    var arr = []; //重组连接参数缓冲用数组
    var url = ""; //连接字符串  
    var param = ""; //参数字符串
    if(re1.test(location.href)) //分解连接字符串
    {
    url = RegExp.$1;
    param = RegExp.$2;
    }
    while(re.exec(param))bank[RegExp.$1] = RegExp.$2; //分析连接字符串中的参数 写入参数集
    while(re.exec(str))bank[RegExp.$1] = RegExp.$2; //分析输入参数 写入参数集 以新代旧
    for(var o in bank)arr[arr.length] = [o,"=",bank[o]].join('');//参数重组
    param = arr.join('&');
    return [url,"?",param].join('');//合并连接字符串
    }
      

  3.   


    <script>
    function connectURLParam(str){
    var url=".../?name1=999&name0=123&name2=zzz[/color]";
    var urlArray=url.split("\/");
    var paramName=new Array();
    var paramValue=new Array();
    var index=0;
    str.replace(/([^&]+=)([^&]*)/g,function($1,$2,$3){
    paramName[index]=$2;
    paramValue[index]=$3;
    index++;
    });
    for(var i=0;i<paramName.length;i++){
    if(url.indexOf(paramName[i])>-1){
    var reg=new RegExp("("+paramName[i]+")[^&]+","g");
    url=url.replace(reg,"$1"+paramValue[i]);
    }else{
    url+="&"+paramName[i]+paramValue[i];
    }
    }
    return url;
    }
    alert(connectURLParam("name1=xxx&name2=yyy&name3=333"));
    </script>
      

  4.   


    [code=HTML]
    <script>
    function connectURLParam(str){
    var url=".../?name1=999&name0=123&name2=zzz[/color]";
    var paramName=new Array();
    var paramValue=new Array();
    var index=0;
    str.replace(/([^&]+=)([^&]*)/g,function($1,$2,$3){
    paramName[index]=$2;
    paramValue[index]=$3;
    index++;
    });
    for(var i=0;i<paramName.length;i++){
    if(url.indexOf(paramName[i])>-1){
    var reg=new RegExp("("+paramName[i]+")[^&]+","g");
    url=url.replace(reg,"$1"+paramValue[i]);
    }else{
    url+="&"+paramName[i]+paramValue[i];
    }
    }
            url=url.replace(/([\?&])[^&]+=(&|$)/g,"$1");//去掉空值
    return url;
    }
    alert(connectURLParam("name1=xxx&name2=yyy&name3=333"));
    </script>[/code]
      

  5.   

    修改BUG<script>
    function connectURLParam(str){
    var url=".../?name1=999&name0=123&name2=zzz[/color]";
    var paramName=new Array();
    var paramValue=new Array();
    var index=0;
    str.replace(/([^&]+=)([^&]*)/g,function($1,$2,$3){
    paramName[index]=$2;
    paramValue[index]=$3;
    index++;
    });
    for(var i=0;i<paramName.length;i++){
    if(url.indexOf(paramName[i])>-1){
    var reg=new RegExp("("+paramName[i]+")[^&]+","g");
    url=url.replace(reg,"$1"+paramValue[i]);
    }else{
    if(url.indexOf("?")==-1){
    url+="?";
    }else{
    url+="&";
    }
    url+=paramName[i]+paramValue[i];
    }
    }
    url=url.replace(/([\?&])[^&]+=(&|$)/g,"$1");//去掉空参数
    url=url.replace(/&$/g,"");//去掉多余的&连接符
    return url;
    }
    alert(connectURLParam("name1=xxx&name2=yyy&name3=333"));
    </script>
      

  6.   

    回gzdiablo 
    测试了,不行呀代码不完整回lip009 
    值的数量是不定的,可能是1个,2个,3个,4个。。
      

  7.   

    能不能给一个完整的代码示例啊?
    首先,要获取调用函数前的URL,然后分析和处理该URL
      

  8.   

    关键数据URL从哪来的不清楚我这测试数据没问题处理前:http://localhost/ml/?name1=check1&name2=check2&name3=check3&name4=check4
    处理后:http://localhost/ml/?name1=xxx&name2=yyy&name3=333&name4=check4给你改成输入URL的试试function modiUrl(url,str)
    {
    var re = /(\w+)\s*=\s*(\w+)/g; //分解参数用表达式
    var re1 = /(.+\/)([^\/]*)$/; //获取连接串2部分的表达式
    re1 = /(.+)\?([^?]*)$/   //如果连接字符串不是"/"结尾 用这个;
    var bank = {}; //参数集
    var arr = []; //重组连接参数缓冲用数组
    //var url = ""; //连接字符串  
    var param = ""; //参数字符串
    if(re1.test(url)) //分解连接字符串
    {
    url = RegExp.$1;
    param = RegExp.$2;
    }
    while(re.exec(param))bank[RegExp.$1] = RegExp.$2; //分析连接字符串中的参数 写入参数集
    while(re.exec(str))bank[RegExp.$1] = RegExp.$2; //分析输入参数 写入参数集 以新代旧
    for(var o in bank)arr[arr.length] = [o,"=",bank[o]].join('');//参数重组
    param = arr.join('&');
    return [url,param].join('?');//合并连接字符串
    }
    document.write("处理前:" + location.href + "<br>");
    document.write("处理后:" + modiUrl(location.href,"name1=xxx&name2=yyy&name3=333"));
    //modiUrl([当前页面连接],[参数字符串])
      

  9.   

    没注意到要去掉空值<script language="javascript">
    String.prototype.trim = function(value){return this.replace(/(^\s+)|(\s+$)/g,"");}
    function modiUrl(url,str)
    {
    var re = /(\w+)\s*=\s*(\w*)/g; //分解参数用表达式
    var re1 = /(.+\/)([^\/]*)$/; //获取连接串2部分的表达式
    //re1 = /(.+)\?([^?]*)$/   //如果连接字符串不是"/"结尾 用这个;
    var bank = {}; //参数集
    var arr = []; //重组连接参数缓冲用数组
    //var url = ""; //连接字符串  
    var param = ""; //参数字符串
    if(re1.test(url)) //分解连接字符串
    {
    url = RegExp.$1;
    param = RegExp.$2;
    }
    while(re.exec(param))bank[RegExp.$1] = RegExp.$2; //分析连接字符串中的参数 写入参数集
    while(re.exec(str))bank[RegExp.$1] = RegExp.$2; //分析输入参数 写入参数集 以新代旧
    for(var o in bank)if(bank[o].trim().length>0)arr[arr.length] = [o,"=",bank[o]].join('');//参数重组
    param = arr.join('&');
    return [url,param].join('?');//合并连接字符串
    }
    document.write("处理前:" + location.href + "<br>");
    document.write("处理后:" + modiUrl(location.href,"name1=xxx&name2=&name3=333"));
    //modiUrl([当前页面连接],[参数字符串])
    </script>
      

  10.   

    回btbtd
    是后台程序应用的GET方式提交避免丢失参数用的回gzdiablo 
    测试可用,但是怎么不能用onclick="modiUrl(location.lref,'name1=xxx&name2=&name3=333');" 方式调用呢?
      

  11.   

    <a href="http://localhost/ml/?name1=check1&name2=check2&name3=check3&name4=check4&name5=check5&name6=check6" onclick="alert(modiUrl(this.href,'name1=xxx&name3=333&name4=check4'));">this.href 测试</a><br>
    <a href="http://localhost/ml/?name1=check1&name2=check2&name3=check3&name4=check4" onclick="alert(modiUrl(location.href,'name1=xxx&name3=333&name4=check4'));">location.href 测试</a><br>是不是你写的不对.我这样测试都没问题
      

  12.   

    onclick="this.href=modiUrl(...." 成功,结贴!万分感谢!
      

  13.   

        var re = /(\w+)\s*=\s*(\w*)/g;
    改成:
        var re = /(\w+)\s*=\s*([\w\u0100-\uffff]*)/g;    while(re.exec(param))bank[RegExp.$1] = RegExp.$2;    //分析连接字符串中的参数 写入参数集
        while(re.exec(str))bank[RegExp.$1] = RegExp.$2;    //分析输入参数 写入参数集 以新代旧
    改成:
        while(re.exec(param))bank[RegExp.$1] = escape(RegExp.$2);    //分析连接字符串中的参数 写入参数集
        while(re.exec(str))bank[RegExp.$1] = escape(RegExp.$2);    //分析输入参数 写入参数集 以新代旧
      

  14.   

    谢谢。
    但还是不行啊,URL被UTF-8编码后显示的不是中文,而是“%E5%93%BA%E4%B9%B3%E5%8A%A8%E7%89%A9”这样的字符串,能不能帮忙再改下?
      

  15.   

        var re = /(\w+)\s*=\s*(\w*)/g;
    改成:
        var re = /(\w+)\s*=\s*([\w%]*)/g;
    其他不变
      

  16.   

    IE 6.0下,不能将函数保存为js调用,提示函数体外不允许有return