100分求一个Javascript函数 再加一个条件:如果调用中包含空的值:name1=xxx&name2=&name3=333则返回的时候将其去掉:name1=xxx&name3=333 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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('');//合并连接字符串} 稍微优化了一下:少了一次遍历!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('');//合并连接字符串} <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> [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] 修改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> 回gzdiablo 测试了,不行呀代码不完整回lip009 值的数量是不定的,可能是1个,2个,3个,4个。。 能不能给一个完整的代码示例啊?首先,要获取调用函数前的URL,然后分析和处理该URL 关键数据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([当前页面连接],[参数字符串]) 没注意到要去掉空值<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> 回btbtd是后台程序应用的GET方式提交避免丢失参数用的回gzdiablo 测试可用,但是怎么不能用onclick="modiUrl(location.lref,'name1=xxx&name2=&name3=333');" 方式调用呢? <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>是不是你写的不对.我这样测试都没问题 onclick="this.href=modiUrl(...." 成功,结贴!万分感谢! 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); //分析输入参数 写入参数集 以新代旧 谢谢。但还是不行啊,URL被UTF-8编码后显示的不是中文,而是“%E5%93%BA%E4%B9%B3%E5%8A%A8%E7%89%A9”这样的字符串,能不能帮忙再改下? var re = /(\w+)\s*=\s*(\w*)/g;改成: var re = /(\w+)\s*=\s*([\w%]*)/g;其他不变 IE 6.0下,不能将函数保存为js调用,提示函数体外不允许有return web onclick 問題 Extjs和php交互的一个问题 jquery 调用函数 form提交后 里面的什么标签的内容都被传到服务器??? 如何为动态生成的Select加类似onchange()的事件 梅花雪树型控件,focus()如何使用?为了使新页面中,保持上个页面,梅花雪控件父节点展开的状态 如何做类似QQ空间那样的通过拖动来布局页面 并且能够保存 src的动态取地址,如何做? 怎么样在5460.net的留言薄写入javascript语言啊? 孟兄请进,有个问题??怎样屏蔽掉ie的后退按钮,就是使他变灰 请教一个正则表达式! 域加载函数
{
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('');//合并连接字符串
}
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('');//合并连接字符串
}
<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>
[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]
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>
测试了,不行呀代码不完整回lip009
值的数量是不定的,可能是1个,2个,3个,4个。。
首先,要获取调用函数前的URL,然后分析和处理该URL
处理后: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([当前页面连接],[参数字符串])
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>
是后台程序应用的GET方式提交避免丢失参数用的回gzdiablo
测试可用,但是怎么不能用onclick="modiUrl(location.lref,'name1=xxx&name2=&name3=333');" 方式调用呢?
<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>是不是你写的不对.我这样测试都没问题
改成:
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); //分析输入参数 写入参数集 以新代旧
但还是不行啊,URL被UTF-8编码后显示的不是中文,而是“%E5%93%BA%E4%B9%B3%E5%8A%A8%E7%89%A9”这样的字符串,能不能帮忙再改下?
改成:
var re = /(\w+)\s*=\s*([\w%]*)/g;
其他不变