前言:最近使用到了他人总结的一个基础类库。查看了下源码,发现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] = '\0';

return;

}

根据url提取网站域名的方法小结的更多相关文章

  1. PHP根据URL提取根域名

    <?php #使用示例 echo getBaseDomain('http://blog.jp.goo.ne.jp/index.php')->domain;echo "\n&quo ...

  2. phpcms v9网站搬家更换域名的方法

    PHPCMS 是国内领先的网站管理系统,同时也是一个开源的PHP开发框架. 本文介绍phpcms v9网站搬家更换域名的方法. 1.在新的主机空间把phpcms安装好. 新安装的版本一定要和准备搬迁的 ...

  3. IIS中多域名多网站的设置方法

    一个 IP 可以绑定多个域名.如您需要实现多个域名访问同一个网站,只需就不同域名添加 A 记录指向同一个 IP 即可. 如您需要实现多个域名访问同一虚拟服务器上不同网站,也需要就不同域名添加 A 记录 ...

  4. 使WordPress改域名后网站正常运行的方法

    使WordPress改域名后网站正常运行的方法 wp-content/wp-config.php $path = '/blog'; $scheme = (isset($_SERVER['HTTPS'] ...

  5. 关于网站子目录绑定二级域名的方法(php网站手机端)

    最近帮客户做zencart网站手机模板用到了二级域名,通过判断手机访问来调用二级目录程序,http://afish.cnblogs.com/ 怎么说都比 http://www.cnblogs.com/ ...

  6. 微信h5支付“网站域名ICP备案主体与商户号主体不一致”的解决方法,H5微信支付 授权函下载

    如下图所示: 微信h5支付“网站域名ICP备案主体与商户号主体不一致”: 需提交H5微信支付 授权函 下载地址:https://download.csdn.net/download/a72400815 ...

  7. java获得采集网页内容的方法小结

          为了写一个java的采集程序,从网上学习到3种方法可以获取单个网页内容的方法,主要是运用到是java IO流方面的知识,对其不熟悉,因此写个小结. import java.io.Buffe ...

  8. 从浅入深详解独立ip网站域名恶意解析的解决方案

    立IP空间的好处想必大家都能耳熟闻详,稳定性强,利于seo等让大家选择了鼎峰网络香港独立IP空间.那么, 网站独享服务器IP地址,独立IP空间利于百度收录和权重的积累.不受牵连.稳定性强等诸多优势为一 ...

  9. laravel中请求用例$request可用的一些方法小结

    laravel中$request可用的一些方法小结 1,请求方法的获取 $method = $request->method(); 2,检测请求方法 $res = $request->is ...

随机推荐

  1. jquery下拉框应用

    <!DOCTYPE html> <html lang="en"> <head> <script src="http://code ...

  2. C++ static静态成员变量在类中仅仅是声明

    今天写代码时看到: 图1的3个静态成员变量在类中仅仅是声明,没有定义以及分配内存:必须在类外,图中就是cpp中,定义分配内存,才能使用

  3. css3 动画属性

    transition Internet Explorer 9 以及更早版本的浏览器不支持 transition 属性. Internet Explorer 10.Firefox.Opera 和 Chr ...

  4. shell 脚本 功能性语句 read,expr,test

    1. read 从终端输入数据赋值给变量 read val 把读入的数据存放到val中 #!/bin/bash echo -n "please input two number :" ...

  5. 通讯录查询(Profile Lookup)——freeCodeCamp

  6. c_数据结构_二叉树的遍历实现

    #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #d ...

  7. ReentrantLock与synchronized的区别

    1.与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性.例如:时间锁等候,可中断锁等候,锁投票. 2.ReentrantLock还提供了条件Cond ...

  8. 校园商铺-2项目设计和框架搭建-6逐层完成SSM的各项配置

    1. 创建/src/main/resources/jdbc.properties文件 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://l ...

  9. thinkphp 模板注释

    模板支持注释功能,该注释文字在最终页面不会显示,仅供模板制作人员参考和识别. 大理石平台厂家 单行注释 格式: {/* 注释内容 */ } 或 {// 注释内容 } 例如: {// 这是模板注释内容 ...

  10. com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"

    报错: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected estab ...