关于取地址中顶级域名求助

小弟现在要做一个访问统计系统,现在遇到的问题是:
访客地址要进行拆分,比如简单的例子是http://community.csdn.net这个地址只要取得csdn.net这个就好,主要有很多情况要考虑进去
--------------------------------------------
1,后缀.com(类似省略)和.com.cn还有.cn这些情况
2,不管是三级域名还是二级域名都要考虑。例http://www.csdn.net,http://news.csdn.net,http://news.paper.csdn.net都只取csdn.net
3,过滤掉ip地址(下面第二步已经解决)
4,省略掉http://www.csdn.net/index.php?word=http://www.csdn.net/&……后面的情况。(下面第一步已经解决)
--------------------------------------------
我的流程是,首先用parse_url取得[host]的地址值,然后判断是否为ip地址,最后再取得所需要的顶级域名。我是用的正则来取的,临时看了一下,写出来没有什么用
-------------------------------------
function GetUrlword($UrlName)
{
preg_match('/^((http &brvbarftp)://([_\.0-9a-z-]+\.){1,1}(com.cn &brvbarnet.cn &brvbarcom &brvbarnet &brvbarorg &brvbarcn &brvbarjp &brvbardk &brvbartw)(/)){1,1}/i', $UrlName, $match);
return $match;
}

1   
2$url = "http://www.csdn.net/index.php?word=http://www.csdn.net/&……";   
3  
4$u = parse_url($url);   
5$host = $u['host'];   
6if($host == long2ip(ip2long($host)))   
7die("是ip");   
8preg_match_all("/(\w+)\\.(.*\\.(\w+))/",$host,$regs);   
9printf("主机: %s

<br/>

1域: %s

<br/>

1顶级域: %s

<br/>

1", $regs[1][0], $regs[2][0], $regs[3][0]);   

===========================================================
唠叨老大,我以adfasdf.111.csdn.net.cn做测试。取得结果:
$regs[0][0]=adfasdf.111.csdn.net.cn
$regs[1][0]=adsfasdf
$regs[2][0]=111.csdn.net.cn
$regs[3][0]=cn

1,我想问一下(\w+)\.(.\.(\w+))这个表达式是怎么分割这个域名的?(字母或数字.任意字符.字母或数字?)
2,域是不是取得还是有点问题?
--------------------------------------------------------
1,我想问一下(\w+)\.(.
\.(\w+))这个表达式是怎么分割这个域名的?(字母或数字.任意字符.字母或数字?)
\w 匹配全部单词字符(数字、字母、下划线)
如不能满足需要,可扩展至[\w-]。一般也就这些了
第一个(\w+)匹配“.”以前的字符
(.*\.(\w+))匹配第一个“.”以后的字符
第二个(\w+)匹配最后一个“.”以后的字符

2,域是不是取得还是有点问题?
一个域名由主域、若干个子域和主机名组成
他们的排列方式是:主机.子域.主域

所谓“域是不是取得还是有点问题?”不知做何讲

唠叨老大:
因为我所取的http://adfasdf.111.csdn.net.cn这个网址的有用的统计部分为csdn.net.cn这里顶级域名,
但是唠叨老大的这个正则取得的是111.csdn.net.cn。
-----------------------------------
ps:我现在又尝试用php中字符串处理函数来做做看。

 1   
 2$url = "http://adfasdf.1111.222.csdn.net.cn/index.php?word=http://www.csdn.net/&……";   
 3$u = parse_url($url);   
 4$host = $u['host'];   
 5if($host == long2ip(ip2long($host)))   
 6die("是ip");   
 7$pieces = explode(".",$host);   
 8$Max_count=count($pieces);   
 9$flag1=$pieces[$Max_count-1];   
10$flag2=$pieces[$Max_count-2];   
11if (strlen($flag1)==2)   
12{   
13if ($flag2=='com' ¦ ¦$flag2=='net' ¦ ¦$flag2=='org' ¦ ¦$flag2=='gov' ¦ ¦$flag2=='edu' ¦ ¦$flag2=='adm' ¦ ¦$flag2=='ac' ¦ ¦$flag2=='bj' ¦ ¦$flag2=='sh' ¦ ¦$flag2=='tj' ¦ ¦$flag2=='cq' ¦ ¦$flag2=='he' ¦ ¦$flag2=='sx' ¦ ¦$flag2=='nm' ¦ ¦$flag2=='ln' ¦ ¦$flag2=='jl' ¦ ¦$flag2=='hl' ¦ ¦$flag2=='js' ¦ ¦$flag2=='zj' ¦ ¦$flag2=='ah' ¦ ¦$flag2=='fj' ¦ ¦$flag2=='jx' ¦ ¦$flag2=='sd' ¦ ¦$flag2=='ha' ¦ ¦$flag2=='hb' ¦ ¦$flag2=='hn' ¦ ¦$flag2=='gd' ¦ ¦$flag2=='gx' ¦ ¦$flag2=='hi' ¦ ¦$flag2=='sc' ¦ ¦$flag2=='gz' ¦ ¦$flag2=='yn' ¦ ¦$flag2=='xz' ¦ ¦$flag2=='sn' ¦ ¦$flag2=='gs' ¦ ¦$flag2=='qh' ¦ ¦$flag2=='nx' ¦ ¦$flag2=='xj' ¦ ¦$flag2=='tw' ¦ ¦$flag2=='hk' ¦ ¦$flag2=='mo')   
14printf("取得域名为:%s.%s.%s",$pieces[$Max_count-3],$pieces[$Max_count-2],$pieces[$Max_count-1]);   
15else   
16printf("取得域名为:%s.%s",$pieces[$Max_count-2],$pieces[$Max_count-1]);   
17}   
18else if (strlen($flag1)!=2)   
19printf("取得域名为:%s.%s",$pieces[$Max_count-2],$pieces[$Max_count-1]);   
20else   
21printf("取得域名错误!");   

---------------------------------
我也只能写个有中国特色的了,唉!国外的情况都不是很清楚了!程序写得很烂,大家尽管修改。
ps:唠叨老大,还是希望你能够写个正则出来,也好让大家好好学习一下。

你是想取最后两个域?
preg_match_all("/.+\.(\w+\.\w+)/",$host,$regs);

to:ice_berg16(寻梦的稻草人)
不是简单的取得最后几个的问题,是取得一个任意合法地址的顶级域名(国际域名或者是国内域名)。因为要统计广告的实际访问量,所以只要是那个主站过来的都算有效。我想了想怎么样都是要判断的,正则在这里可能用处不是很大,正则也只能机械的取值了,要不然就是会写得很臃肿,我上面得估计也凑合了,先用着吧。
------------------------------------
ps:域名真的很麻烦!
感谢大家的帮助,结贴了!

Published At
Categories with Web编程
Tagged with
comments powered by Disqus