有的时候我们要操作一个URL地址中查询参数,为了不破坏URL的原有结构,我们一般不能直接在URL的后面加&query=value,特别是我们的URL中有多个参数时,这种处理更麻烦。
下面两个小方法就是专门用来为一个URL添加一个查询参数或删除一个查询参数,这两个方法隐藏了原URL有无参数,是不是原来就有这个参数,有没有fragment(#anchor)这些细节和处理
/**////<summary>
///AddaquerytoanURL.
///iftheURLhasnotanyquery,thenappendthequerykeyandvaluetoit.
///iftheURLhassomequeries,thencheckitifexiststhequerykeyalready,replacethevalue,orappendthekeyandvalue
///iftheURLhasanyfragment,appendfragmentstotheURLend.
///</summary>
publicstaticstringSafeAddQueryToURL(stringkey,stringvalue,stringurl)
{
intfragPos=url.LastIndexOf("#");
stringfragment=string.Empty;
if(fragPos>-1)
{
fragment=url.Substring(fragPos);
url=url.Substring(0,fragPos);
}
intquerystart=url.IndexOf("?");
if(querystart<0)
{
url+="?"+key+"="+value;
}
else
{
Regexreg=newRegex(@"(?<=[&?])"+key+@"=[^s",RegexOptions.Compiled);
if(reg.IsMatch(url))
url=reg.Replace(url,key+"="+value);
else
url+="&"+key+"="+value;
}
returnurl+fragment;
}
/**////<summary>
///Removeaqueryfromurl
///</summary>
///<paramname="key"></param>
///<paramname="url"></param>
///<returns></returns>
publicstaticstringSafeRemoveQueryFromURL(stringkey,stringurl)
{
Regexreg=newRegex(@"[&?]"+key+@"=[^s",RegexOptions.Compiled);
returnreg.Replace(url,newMatchEvaluator(PutAwayGarbageFromURL));
}
privatestaticstringPutAwayGarbageFromURL(Matchmatch)
{
stringvalue=match.Value;
if(value.EndsWith("&"))
returnvalue.Substring(0,1);
else
returnstring.Empty;
}
测试:
strings="http://www.cnblogs.com/?a=1&b=2&c=3#tag";
WL(SafeRemoveQueryFromURL("a",s));
WL(SafeRemoveQueryFromURL("b",s));
WL(SafeRemoveQueryFromURL("c",s));
WL(SafeAddQueryToURL("d","new",s));
WL(SafeAddQueryToURL("a","newvalue",s));
//输出如下:
//http://www.cnblogs.com/?b=2&c=3#tag
//http://www.cnblogs.com/?a=1&c=3#tag
//http://www.cnblogs.com/?a=1&b=2#tag
//http://www.cnblogs.com/?a=1&b=2&c=3&d=new#tag
//http://www.cnblogs.com/?a=newvalue&b=2&c=3#tag