网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

根据url提取网站域名的方法小结

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

前言:最近使用到了他人总结的一个基础类库。查看了下源码,发现String帮助类的一个辅助方法不是很严谨,重构之。

1、原来程序的写法

  1. public static string GetDomainName(string url) 
  2.   { 
  3.       Regex reg = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+/?"); 
  4.       string result = reg.Match(url, 0).Value; 
  5.       if (result.IndexOf("http://") > -1) 
  6.       { 
  7.           result = result.Replace("http://"string.Empty); 
  8.       } 
  9.       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.aspxcs.net/ 的形式的字符串,然后再处理字符串。字符串替换和hard coding看起来会比较多,而且,毫无疑问,上面代码中的正则提取的字符串稍显冗余。我的改进如下

  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.      } 

应该说这是比较忠实于源代码的一种实现。
【UPDATE】:根据文章后面布袋和尚说不得大师的指点,再改进一下正则表达式,这样对于正常的url路径或其他类型的路径都可以进行验证匹配了。代码如下:    

  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-]+(?<=/?)"); 
  8.          return reg.Match(url, 0).Value.Replace("/"string.Empty); 
  9.      } 

(2)直接拼接字符串
  拼接字符串在实际开发中可以做很多事情,简单的域名提取自然不在话下。我们分析一下输入的url,发现很显著也很重要的一个特征就是通过斜线(/)来分割字符串,每一个分隔后的字符串分别表示不同的属性,如对应的协议名称,域名,站点名,页面名称等等。具体分割拼接提取的方法如下:

  1. public static string GetDomainName(string url) 
  2.    { 
  3.         if (url == null
  4.        { 
  5.            throw new Exception("输入的url为空"); 
  6.        } 
  7.        string result = string.Empty; 
  8.        string strArr = url.Split(new char { '/' }, StringSplitOptions.RemoveEmptyEntries); 
  9.        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对象,然后按步就班即可。具体方法如下:

  1. public static string GetDomainName(string url) 
  2.     string result = null
  3.     try 
  4.     { 
  5.         HttpRequest request = new HttpRequest(string.Empty, url, string.Empty); 
  6.         result = request.Url.Host; 
  7.     } 
  8.     catch (Exception ex) 
  9.     { 
  10.         throw new Exception(string.Format("当前输入的URL:{0},发生异常:{1}", url, ex.Message)); 
  11.     } 
  12.     return result; 

这个应该算是另辟蹊径的一种解决方案,可是必需要引用System.Web dll,作为基础类库,应该越少引用越好。
结语:到这里,根据url提取host的常规方法基本重构完成,没有过分考虑效率和性能,不知哪种会更快一点。期待您更好的方法和意见。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师