求可以用的匹配域名的正则表达式

时间:2022-08-25 18:47:36
上周在baidu上花了2个小时 搜到一个匹配域名的正则表达式 很好用 
今天来 改程序 把那个代码覆盖掉了 
然后再也想不起是用什么关键词搜到的 
历史记录中也没这个页面 因为是搜索结果页面上的最佳答案 直接复制的 没有打开网页
求可以用的匹配域名的正则表达式

刚才又找了2个小时 99%都是不完善代码 比如简单的用a-z/A-Z/0-9去匹配 
还有所有以http/https/ftp开头的代码 都不是我想要的 

要求匹配
http://www.csdn.net
http://csdn.net
www.csdn.net
csdn.net
cs-dn.net   
csdn.net:8080
abc.123.csdn.net

但不要求匹配
csdn.net/xxx  (后面部分不要)

8 个解决方案

#1


引用
"(?:https?|ftp)\:\/\/(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?"


找了一个还算能用的 是以http开始的(当然可以去掉这部分) 
但还是无法识别域名后面带标点符号的
比如 http://csdn.net;  把;也算域名了





#2


‘1------------------------------------------------------
url=request.servervariables("SERVER_NAME")
response.write mid(url,Instr(url,".")+1,len(url))

’2------------------------------------------------------
Dim ServerName1, ServerName2, iCount
ServerName1 = Split(Request.ServerVariables("SERVER_NAME"), ".")
iCount = UBound(ServerName1)
ServerName2 = ServerName1(iCount-1) & "." & ServerName1(iCount)
response.Write(ServerName2)

#3


这段代码 还把 http://www.csdn  误认为域名了

#4


引用 3 楼 u014726793 的回复:
这段代码 还把 http://www.csdn  误认为域名了

难道你是判断友情链接?
要不然怎么会做这种判断呢,因为这种域名压根就不存在。

#5


<% 
response.write getdomain("www.aaa.hk") & "<br />" 
response.write getdomain("blog.aaa.hk") & "<br />" 
response.write getdomain("mscga.blog.aaa.hk") & "<br />" 
function getdomain(byval dom) ’ 返回空则表示域名不复合域名根要求 
 dim i,ext,exts 
 exts = "com.cn,net.cn,org.cn,hk.cn,com,net,cn,hk" ’ 复根在前,单根在后 
 ext = split(exts,",") 
 for i = 0 to ubound(ext) 
  if lcase(ext(i)) = right(lcase(dom),len(ext(i))) then 
   dim dom_ext,dom_pre 
   dom_ext = lcase(ext(i)) 
   dom_pre = split(left(dom,len(dom)-len(dom_ext)-1),".") 
   getdomain = dom_pre(ubound(dom_pre)) & "." & dom_ext 
   exit function 
  end if 
 next 
 getdomain = "" 
end function 
%>

#6


引用 4 楼 snfqbujj 的回复:
Quote: 引用 3 楼 u014726793 的回复:

这段代码 还把 http://www.csdn  误认为域名了

难道你是判断友情链接?
要不然怎么会做这种判断呢,因为这种域名压根就不存在。


是从某一篇文章中 读出其中包含的所有域名 然后判断这些域名 是否在黑名单上 

#7


 (?:https?|ftp)\:\/\/(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?

测试了一下
这个代码 可以找到 http://开头的域名  只是会出现 http://www.csdn  这样的错误 但不会出现 http://www.csdn.net;

我简单的把http部分去掉 代码改为 

(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?

可以找到带和不带http的全部域名 但会出现 http://www.csdn.net; 这样错误 

#8


而一篇文章中 可能包含10个不同格式的域名 都要找出来 

#1


引用
"(?:https?|ftp)\:\/\/(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?"


找了一个还算能用的 是以http开始的(当然可以去掉这部分) 
但还是无法识别域名后面带标点符号的
比如 http://csdn.net;  把;也算域名了





#2


‘1------------------------------------------------------
url=request.servervariables("SERVER_NAME")
response.write mid(url,Instr(url,".")+1,len(url))

’2------------------------------------------------------
Dim ServerName1, ServerName2, iCount
ServerName1 = Split(Request.ServerVariables("SERVER_NAME"), ".")
iCount = UBound(ServerName1)
ServerName2 = ServerName1(iCount-1) & "." & ServerName1(iCount)
response.Write(ServerName2)

#3


这段代码 还把 http://www.csdn  误认为域名了

#4


引用 3 楼 u014726793 的回复:
这段代码 还把 http://www.csdn  误认为域名了

难道你是判断友情链接?
要不然怎么会做这种判断呢,因为这种域名压根就不存在。

#5


<% 
response.write getdomain("www.aaa.hk") & "<br />" 
response.write getdomain("blog.aaa.hk") & "<br />" 
response.write getdomain("mscga.blog.aaa.hk") & "<br />" 
function getdomain(byval dom) ’ 返回空则表示域名不复合域名根要求 
 dim i,ext,exts 
 exts = "com.cn,net.cn,org.cn,hk.cn,com,net,cn,hk" ’ 复根在前,单根在后 
 ext = split(exts,",") 
 for i = 0 to ubound(ext) 
  if lcase(ext(i)) = right(lcase(dom),len(ext(i))) then 
   dim dom_ext,dom_pre 
   dom_ext = lcase(ext(i)) 
   dom_pre = split(left(dom,len(dom)-len(dom_ext)-1),".") 
   getdomain = dom_pre(ubound(dom_pre)) & "." & dom_ext 
   exit function 
  end if 
 next 
 getdomain = "" 
end function 
%>

#6


引用 4 楼 snfqbujj 的回复:
Quote: 引用 3 楼 u014726793 的回复:

这段代码 还把 http://www.csdn  误认为域名了

难道你是判断友情链接?
要不然怎么会做这种判断呢,因为这种域名压根就不存在。


是从某一篇文章中 读出其中包含的所有域名 然后判断这些域名 是否在黑名单上 

#7


 (?:https?|ftp)\:\/\/(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?

测试了一下
这个代码 可以找到 http://开头的域名  只是会出现 http://www.csdn  这样的错误 但不会出现 http://www.csdn.net;

我简单的把http部分去掉 代码改为 

(?:(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,;\=:]|%[0-9a-f]{2,2})*\@)?(?:((?:(?:[a-z0-9][a-z0-9\-]*[a-z0-9]|[a-z0-9])\.)*(?:[a-z][a-z0-9\-]*[a-z0-9]|[a-z])|(?:\[[^\]]*\]))(?:\:[0-9]*)?)(?:\/(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@]|%[0-9a-f]{2,2})*)*(?:\?(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?(?:\#(?:[a-z0-9\-\._~\!\$\&\'\(\)\*\+\,\;\=\:\@\/\?]|%[0-9a-f]{2,2})*)?

可以找到带和不带http的全部域名 但会出现 http://www.csdn.net; 这样错误 

#8


而一篇文章中 可能包含10个不同格式的域名 都要找出来