根据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; { } { } 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 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对象,然后按步就班即可。具体方法如下:
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的常规方法基本重构完成,没有过分考虑效率和性能,不知哪种会更快一点。期待您更好的方法和意见。
作者:Jeff Wong
出处:http://jeffwongishandsome.cnblogs.com/
本文版权归作者和博客园共有,欢迎围观转载。转载时请您务必在文章明显位置给出原文链接,谢谢您的合作。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2009-10-14 c#3.0关于JSON简单操作的实用帮助类(泛型实现)