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,作为基础类库,应该越少引用越好。
本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2010/10/14/1851217.html,如需转载请自行联系原作者