小弟现在要做一个访问统计系统,现在遇到的问题是:
访客地址要进行拆分,比如简单的例子是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 ¦ftp)://([_\.0-9a-z-]+\.){1,1}(com.cn ¦net.cn ¦com ¦net ¦org ¦cn ¦jp ¦dk ¦tw)(/)){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:域名真的很麻烦!
感谢大家的帮助,结贴了!