根据url提取网站域名的方法小结
根據url提取網站域名的方法小結
前言:最近使用到了他人總結的一個基礎類庫。查看了下源碼,發現String幫助類的一個輔助方法不是很嚴謹,重構之。
1、原來程序的寫法
飛秋-http://www.freeeim.com/
view sourceprint?01 public static string GetDomainName(string url)?
02?? {?
03?????? Regex reg = new Regex(@"http(s)?://([/w-]+/.)+[/w-]+/?");?
04?????? string result = reg.Match(url, 0).Value;?
05?????? if (result.IndexOf("http://") > -1)?
06?????? {?
07?????????? result = result.Replace("http://", string.Empty);?
08?????? }?
09?????? else if (result.IndexOf("https://") > -1)?
10?????? {?
11?????????? result = result.Replace("https://", string.Empty);?
12?????? }?
13?????? return result.Replace("/", string.Empty);?
14?? }
2、改進方案
上面的寫法,我認為不嚴謹的地方有兩處:a、沒有區分部分字符串的大小寫(雖然通常傳入的url都是小寫http(s)開頭的,使用起來問題不大);b、參數沒有考慮為null的情況。下面給出我的幾種解決方法,個人認為相對而言比較簡潔嚴謹一些。
???? (1)正則改進
按照原來代碼的寫法,正則表達式是先提取出形如 http://www.freeeim.com/ 的形式的字符串,然后再處理字符串。字符串替換和hard coding看起來會比較多,而且,毫無疑問,上面代碼中的正則提取的字符串稍顯冗余。我的改進如下:
view sourceprint?1 public static string GetDomainName(string url)?
2????? {?
3????????? if (url == null)?
4????????? {?
5????????????? throw new Exception("輸入的url為空");?
6????????? }?
7????????? Regex reg = new Regex(@"(?<=[://])([/w-]+/.)+[/w-]+/?", RegexOptions.IgnoreCase);?
8????????? return reg.Match(url, 0).Value.Replace("/", string.Empty);?
9????? }
??? 應該說這是比較忠實于源代碼的一種實現。????
?? (2)直接拼接字符串
拼接字符串在實際開發中可以做很多事情,簡單的域名提取自然不在話下。我們分析一下輸入的url,發現很顯著也很重要的一個特征就是通過斜線(/)來分割字符串,每一個分隔后的字符串分別表示不同的屬性,如對應的協議名稱,域名,站點名,頁面名稱等等。具體分割拼接提取的方法如下:
view sourceprint?01 public static string GetDomainName(string url)?
02??? {?
03???????? if (url == null)?
04??????? {?
05??????????? throw new Exception("輸入的url為空");?
06??????? }?
07??????? string result = string.Empty;?
08??????? string[] strArr = url.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);?
09??????? foreach (string item in strArr)?
10??????? {?
11??????????? if (string.Compare("http:", item.ToLower()) == 0)?
12??????????? {?
13??????????????? continue;?
14??????????? }?
15??????????? else if (string.Compare("https:", item.ToLower()) == 0)?
16??????????? {?
17??????????????? continue;?
18??????????? }?
19??????????? result = item;?
20??????????? break;?
21??????? }?
22??????? return result;?
23??? }
?????????? 嚴格來說,這個是比較“笨”的方法,但是通俗易懂。
????? (3)通過一個HttpRequest對象獲取它的Url的Host
平時我們都是通過HttpRequest對象獲取它的Url的Host來獲取網站域名,現在只有一個字符串參數url,很顯然,我們會想到構造一個HttpRequest對象,然后按步就班即可。具體方法如下:
view sourceprint?01 public static string GetDomainName(string url)?
02 {?
03???? string result = null;?
04???? try
05???? {?
06???????? HttpRequest request = new HttpRequest(string.Empty, url, string.Empty);?
07???????? result = request.Url.Host;?
08???? }?
09???? catch (Exception ex)?
10???? {?
11???????? throw new Exception(string.Format("當前輸入的URL:{0},發生異常:{1}", url, ex.Message));?
12???? }?
13???? return result;?
14 }
?????? 這個應該算是另辟蹊徑的一種解決方案,可是必需要引用System.Web dll,作為基礎類庫,應該越少引用越好。
?
結語:到這里,根據url提取host的常規方法基本重構完成,沒有過分考慮效率和性能,不知哪種會更快一點。期待您更好的方法和意見。
?
總結
以上是生活随笔為你收集整理的根据url提取网站域名的方法小结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC文档/视图结构体系及SDI回顾(2
- 下一篇: 深入理解文档/视图框架体系_九宫格项目开