前言:最近使用到了他人总结的一个基础类库。查看了下源码,发现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. Xpath-Extraction 关联

    //*[local-name()="qqCheckOnlineResult"] //开头 *代表的是任意的标签 local-name():寻找标签名

  2. 添加ASP.NET AJAX控件工具集到VS2010的方法

    在VS2010中Ajax控件只有5个,其实还有很多支持AJAX特定功能的服务器控件,微软是将这些控件当作开放源代码项目.所以没有集成到VS2010中.这些AJAX控件被称为ASP.NET AJAX控件 ...

  3. innodb_file_per_table 理解

    MYSQL innodb存储引擎 默认将所有的数据库 innodb 引擎的表数据存储在一个共享空间中:ibdata1,当增删数据库的时候, ibdata1文件不会自动收缩,单个数据库的备份也会成为问题 ...

  4. C#利用资源文件设置软件自适应多语言

    在项目更目录下添加两个资源文件,以适应中英文两种版本,如Resource.zh_CN.resx和      Resource.en-US.resx  ,两个资源文件的ID都一样,值分别配置相应的中英文 ...

  5. react添加多个域名proxy代理,跨域

    在package.json中加入如下: { "name": "demo", "version": "0.1.0", &q ...

  6. merge存储引擎基本介绍和使用规范说明

    [以下两段截自MySql手册]: merge存储引擎,也被认识为mrg_myisam引擎,是一个"相同“的表可以被当作一个表来用的myisam表的集合.“相同”意味着所有表同样的列和索引信息 ...

  7. 校园商铺-2项目设计和框架搭建-5配置maven

    /src/main/java 存放业务的Java代码 /src/main/resources 存储项目所用到的资源文件,如各种Spring,batis,日志的配置文件 /src/test/java 单 ...

  8. Windows shutdown

    用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f]    ...

  9. ibator配置文件说明文档

    1. <classPathEntry>  属性名 说明 示例 location 数据库驱动文件路径 lib/mysql-connector-java-5.1.6-bin.jar   2.  ...

  10. 模拟MySQL命令

    staff_table 1,Alex Li,22,13651054608,IT,2013-04-01 2,Jack Wang,30,13304320533,HR,2015-05-03 3,Rain L ...