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


    前言:最近使用到了他人总结的一个基础类库。查看了下源码,发现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.cnblogs.com/ 的形式的字符串,然后再处理字符串。字符串替换和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,作为基础类库,应该越少引用越好。

    结语:到这里,根据url提取host的常规方法基本重构完成,没有过分考虑效率和性能,不知哪种会更快一点。期待您更好的方法和意见。

  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/jeffwongishandsome/p/1851217.html
Copyright © 2020-2023  润新知