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


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

    1、原来程序的写法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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看起来会比较多,而且,毫无疑问,上面代码中的正则提取的字符串稍显冗余。我的改进如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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路径或其他类型的路径都可以进行验证匹配了。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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,发现很显著也很重要的一个特征就是通过斜线(/)来分割字符串,每一个分隔后的字符串分别表示不同的属性,如对应的协议名称,域名,站点名,页面名称等等。具体分割拼接提取的方法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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 itemin 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对象,然后按步就班即可。具体方法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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的常规方法基本重构完成,没有过分考虑效率和性能,不知哪种会更快一点。期待您更好的方法和意见。


    示例2:

    void getDns(char *str, char *des){//str为待处理的字符串,des为提取出的域名。
    int i = 0, j = 0;
    while(str[i] != '.'){
    i++;
    }
    i++;
    while(str[i] != '.'){
    des[j++] = str[i++];
    }
    des[j] = '';
    return;
    }

  • 相关阅读:
    Spring Boot中使用logback日志框架
    Java日志框架-logback配置文件参考(转)
    Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)
    MySQL取每组的前N条记录
    跟大佬一起读源码:CurrentHashMap的扩容机制
    源码速读及点睛:HashMap
    求两个Linux文本文件的交集、差集、并集
    哪个先执行:@PostConstruct和@Bean的initMethod?
    Android Studio3.0 Error:Execution failed for task ':app:javaPreCompileDebug' 错误
    Android原生项目集成React Native
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289181.html
Copyright © 2020-2023  润新知