根據url提取網站域名的方法小結

作者: seasun  發布時間: 2010-10-18 21:17  閱讀: 1233 次  推薦: 0   原文鏈接   [收藏]  
摘要:使用到了他人總結的一個基礎類庫。查看了下源碼,發現String幫助類的一個輔助方法不是很嚴謹,重構之。

  1、原來程序的寫法

public static string GetDomainName(string url)
        {
            Regex reg = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+/?");
            string result = reg.Match(url, 0).Value;
            if (result.IndexOf("http://") > -1)
            {
                result = result.Replace("http://", string.Empty);
            }
            else if (result.IndexOf("https://") > -1)
            {
                result = result.Replace("https://", string.Empty);
            }
            return result.Replace("/", string.Empty);
        }

  2、改進方案

  上面的寫法,我認為不嚴謹的地方有兩處:a、沒有區分部分字符串的大小寫(雖然通常傳入的url都是小寫http(s)開頭的,使用起來問題不大);b、參數沒有考慮為null的情況。下面給出我的幾種解決方法,個人認為相對而言比較簡潔嚴謹一些。

  (1)正則改進

  按照原來代碼的寫法,正則表達式是先提取出形如 http://www.iwanna.cn/ 的形式的字符串,然后再處理字符串。字符串替換和hard coding看起來會比較多,而且,毫無疑問,上面代碼中的正則提取的字符串稍顯冗余。我的改進如下:

 public static string GetDomainName(string url)
        {
            if (url == null)
            {
                throw new Exception("輸入的url為空");
            }
            Regex reg = new Regex(@"(?<=[://])([\w-]+\.)+[\w-]+/?", RegexOptions.IgnoreCase);
            return reg.Match(url, 0).Value.Replace("/", string.Empty);
        }

應該說這是比較忠實于源代碼的一種實現。
  【UPDATE】:根據文章后面布袋和尚說不得大師的指點,再改進一下正則表達式,這樣對于正常的 url路徑或其他類型的路徑都可以進行驗證匹配了。代碼如下:

public static string GetDomainName(string url)
        {
            if (url == null)
            {
                throw new Exception("輸入的url為空");
            }
            Regex reg = new Regex(@"(?<=://)([\w-]+\.)+[\w-]+(?<=/?)");
            return reg.Match(url, 0).Value.Replace("/", string.Empty);
        }

  (2)直接拼接字符串

  拼接字符串在實際開發中可以做很多事情,簡單的域名提取自然不在話下。我們分析一下輸入的url,發現很顯著也很重要的一個特征就是通過斜線(/)來分割字符串,每一個分隔后的字符串分別表示不同的屬性,如對應的協議名稱,域名,站點名,頁面名稱等等。具體分割拼接提取的方法如下:

public static string GetDomainName(string url)
        {
             if (url == null)
            {
                throw new Exception("輸入的url為空");
            }
            string result = string.Empty;
            string[] strArr = url.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (string item in strArr)
            {
                if (string.Compare("http:", item.ToLower()) == 0)
                {
                    continue;
                }
                else if (string.Compare("https:", item.ToLower()) == 0)
                {
                    continue;
                }
                result = item;
                break;
            }
            return result;
        }

  嚴格來說,這個是比較“笨”的方法,但是通俗易懂。

  (3)通過一個HttpRequest對象獲取它的Url的Host

  平時我們都是通過HttpRequest對象獲取它的Url的Host來獲取網站域名,現在只有一個字符串參數url,很顯然,我們會想到構造一個HttpRequest對象,然后按步就班即可。具體方法如下:

   public static string GetDomainName(string url)
        {
            string result = null;
            try
            {
                HttpRequest request = new HttpRequest(string.Empty, url, string.Empty);
                result = request.Url.Host;
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("當前輸入的URL:{0},發生異常:{1}", url, ex.Message));
            }
            return result;
        }

這個應該算是另辟蹊徑的一種解決方案,可是必需要引用System.Web dll,作為基礎類庫,應該越少引用越好。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()