根据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的常规方法基本重构完成,没有过分考虑效率和性能,不知哪种会更快一点。期待您更好的方法和意见。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值