URL处理两个小工具方法

有的时候我们要操作一个URL地址中查询参数,为了不破坏URL的原有结构,我们一般不能直接在URL的后面加&query=value,特别是我们的URL中有多个参数时,这种处理更麻烦。
下面两个小方法就是专门用来为一个URL添加一个查询参数或删除一个查询参数,这两个方法隐藏了原URL有无参数,是不是原来就有这个参数,有没有fragment(#anchor)这些细节和处理
        /// <summary>
        
/// Add a query to an URL.
        
/// if the URL has not any query,then append the query key and value to it.
        
/// if the URL has some queries, then check it if exists the query key already,replace the value, or append the key and value
        
/// if the URL has any fragment, append fragments to the URL end.
        
/// </summary>

        public static string SafeAddQueryToURL(string key,string value,string url)
        
{
            
int fragPos = url.LastIndexOf("#");
            
string fragment = string.Empty;
            
if(fragPos > -1)
            
{
                fragment 
= url.Substring(fragPos);
                url 
= url.Substring(0,fragPos);
            }

            
int querystart = url.IndexOf("?");
            
if(querystart < 0)
            
{
                url 
+="?"+key+"="+value;
            }

            
else
            
{
                Regex reg 
= new Regex(@"(?<=[&\?])"+key+@"=[^\s&#]*",RegexOptions.Compiled);
                
if(reg.IsMatch(url))
                    url 
= reg.Replace(url,key+"="+value);
                
else
                    url 
+= "&"+key+"="+value;
            }

            
return url+fragment;
        }

        
/// <summary>
        
/// Remove a query from url
        
/// </summary>
        
/// <param name="key"></param>
        
/// <param name="url"></param>
        
/// <returns></returns>

        public static string SafeRemoveQueryFromURL(string key,string url)
        
{
            Regex reg 
= new Regex(@"[&\?]"+key+@"=[^\s&#]*&?",RegexOptions.Compiled);
            
return reg.Replace(url,new MatchEvaluator(PutAwayGarbageFromURL));
        }

        
private static string PutAwayGarbageFromURL(Match match)
        
{
            
string value = match.Value;
            
if(value.EndsWith("&"))
                
return value.Substring(0,1);
            
else
                
return string.Empty;
        }


测试:
            string s = "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
posted @ 2006-05-25 13:08 THIN 阅读(3476) 评论(12)  编辑 收藏 所属分类: ASP.net

  回复  引用  查看    
#2楼 [楼主]2006-05-25 13:54 | THIN      
如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:
<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。实现方法如下:
IServiceProvider provider=(IServiceProvider)HttpContext.Current;
HttpWorkerRequest wr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[]bs=wr.GetPreloadedEntityBody();
.
if(!wr.IsEntireEntityBodyIsPreloaded())
{
intn=1024;
byte[]bs2=newbyte[n];
while(wr.ReadEntityBody(bs2,n)>0)
{
..
}
}这样就可以解决了大文件的上传问题了。

  回复  引用  查看    
#3楼 [楼主]2006-05-25 13:55 | THIN      
@birdshome
你的是客户端的,我是专在服务器端做增减QueryString的
  回复  引用  查看    
#4楼 2006-05-25 14:02 | Dflying Chen      
正则表达式最好不用
  回复  引用  查看    
#5楼 [楼主]2006-05-25 14:15 | THIN      
@Dflying Chen
不知你何以得出这样的结论
  回复  引用    
#6楼 2006-05-25 14:32 | B4 [未注册用户]
有点小题大做了吧
  回复  引用  查看    
#7楼 2006-05-25 14:49 | dudu      
不错!很有用的小工具!
在博客园的程序中经常用到,我自己简单写了这两个方法,现在可以用你这个了,呵呵!
  回复  引用  查看    
#8楼 [楼主]2006-05-25 15:06 | THIN      
@B4
看你的feedback这个本来想从首页撤了的
@dudu
看你的feedback还是再放放,呵呵
  回复  引用  查看    
#9楼 2006-05-25 15:34 | Dflying Chen      
@THIN
效率阿……
  回复  引用  查看    
#10楼 [楼主]2006-05-25 15:41 | THIN      
@Dflying Chen
这个你倒是可以把代码改成字符串操作函数版再运行个几万遍对比一下
绝对Regex要高,特别是RegexOptions|Complied
  回复  引用  查看    
#11楼 2006-05-25 15:46 | Dflying Chen      
@THIN
不会吧……还头一次听说Regex比String快的……
  回复  引用  查看    
#12楼 2006-09-12 13:34 | Tiger!      
好象string 中用indexof效率比正则高啊?有没人指点下,谢谢~