CODE-剔除特定QueryString參數
| | | 2 | |
需要將URL中的某個QueryString參數移除的函數,例如: 原本是httq://www.com/a.aspx?a=1&b=2&c=3,將b移除後要變成httq://www.com/a.aspx?a=1&c=3,分別用Regex及ParseQueryString試寫,因為要考慮b是第一個、最後一個及唯一參數情境下對?及&符號的需求不同,增加了程式的複雜度。
經簡單測試,二者效果相同。不過若考量Regex在遇到比對文字(即參數名稱)中出現Regular Expression特殊符號時會失效,我想ParseQueryString會是較好的選擇。
using System; using System.Collections.Specialized; using System.Linq; using System.Text.RegularExpressions; using System.Web; namespace ConsoleApplication1 { class Program { static void Main(string[] args)
{ string[] tests = { "http://www.com", "http://www.com/a?a=2", "http://www.com/a.aspx?a=%3e&boo=2&c=3", "http://www.com/a.aspx?boo=1&a=1", "http://www.com/a.aspx?boo=2" };
foreach (string line in tests)
{ Console.WriteLine("Source = {0}", line); Console.WriteLine("Regex : {0}", RemoveQueryParam1(line, "boo"));
Console.WriteLine("HttpUtility : {0}", RemoveQueryParam2(line, "boo"));
Console.WriteLine();
}
Console.Read();
}
//設法用RegularExpression比對抽換 public static string RemoveQueryParam1(string url, string key)
{ return Regex.Replace(url, "[?&]" + key + "=[^&]*[&]{0,1}",
//若為&boo=...則直接去除,?boo=...&...則要傳回? //...&boo=...&...時要傳回& o => (o.Value.StartsWith("?") && o.Value.EndsWith("&") ? "?" : "") +
(o.Value.StartsWith("&") && o.Value.EndsWith("&") ? "&" : "")
);
}
//使用.NET內建機制 public static string RemoveQueryParam2(string url, string key)
{ //拆出QueryString部分 Uri uri = new Uri(url); if (string.IsNullOrEmpty(uri.Query)) return url;
//用HttpUtility.ParseQueryString()將其解析為成對Name/Value集合 //在ASP.NET中直接用Request.QueryString即可 NameValueCollection args = HttpUtility.ParseQueryString(uri.Query);
args.Remove(key);
return url.Substring(0, url.IndexOf("?") +
//若有參數就多加1 (args.Count > 0 ? 1 : 0)) +
string.Join("&",
//將NameValueCollection Cast<string>取得可LINQ的Keys集合 args.Cast<string>().Select( k => string.Format("{0}={1}", k,
HttpUtility.UrlEncode(args[k]))));
}
}
}
測試結果:
Source = httq://www.com Regex : httq://www.com httpUtility : httq://www.com Source = httq://www.com/a?a=2 Regex : httq://www.com/a?a=2 httpUtility : httq://www.com/a?a=2 Source = httq://www.com/a.aspx?a=%3e&boo=2&c=3 Regex : httq://www.com/a.aspx?a=%3e&c=3 httpUtility : httq://www.com/a.aspx?a=%3e&c=3 Source = httq://www.com/a.aspx?boo=1&a=1 Regex : httq://www.com/a.aspx?a=1 httpUtility : httq://www.com/a.aspx?a=1 Source = httq://www.com/a.aspx?boo=2 Regex : httq://www.com/a.aspx httpUtility : httq://www.com/a.aspx
Comments
# by Eric HUang
大大你有一行應該測試完之後沒改到 args.Remove("boo"); 應改為 args.Remove(key); 才對 ^^
# by Jeffrey
to Eric, 真的,我漏改了!! 謝謝提醒~~