<?php
$url = "http://www.csdn.net/index.php?word=http://www.csdn.net/&……";$u = parse_url($url);
$host = $u['host'];
if($host == long2ip(ip2long($host)))
  die("是ip");
preg_match_all("/(\w+)\.(.*\.(\w+))/",$host,$regs);
printf("主机: %s<br>域: %s<br>顶级域: %s<br>", $regs[1][0], $regs[2][0], $regs[3][0]);
?>

解决方案 »

  1.   

    唠叨老大,我以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,域是不是取得还是有点问题?
      

  2.   

    1,我想问一下(\w+)\.(.*\.(\w+))这个表达式是怎么分割这个域名的?(字母或数字.任意字符.字母或数字?)
    \w 匹配全部单词字符(数字、字母、下划线)
    如不能满足需要,可扩展至[\w-]。一般也就这些了
    第一个(\w+)匹配“.”以前的字符
    (.*\.(\w+))匹配第一个“.”以后的字符
    第二个(\w+)匹配最后一个“.”以后的字符2,域是不是取得还是有点问题?
    一个域名由主域、若干个子域和主机名组成
    他们的排列方式是:主机.子域.主域所谓“域是不是取得还是有点问题?”不知做何讲
      

  3.   

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

  4.   

    <?php
    $url = "http://adfasdf.1111.222.csdn.net.cn/index.php?word=http://www.csdn.net/&……";
    $u = parse_url($url);
    $host = $u['host'];
    if($host == long2ip(ip2long($host)))
      die("是ip");
    $pieces = explode(".",$host);
    $Max_count=count($pieces);
    $flag1=$pieces[$Max_count-1];
    $flag2=$pieces[$Max_count-2];
    if (strlen($flag1)==2)
       {
         if ($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')
     printf("取得域名为:%s.%s.%s",$pieces[$Max_count-3],$pieces[$Max_count-2],$pieces[$Max_count-1]);
     else
     printf("取得域名为:%s.%s",$pieces[$Max_count-2],$pieces[$Max_count-1]);
       }
    else if (strlen($flag1)!=2)
    printf("取得域名为:%s.%s",$pieces[$Max_count-2],$pieces[$Max_count-1]);
    else
    printf("取得域名错误!");
    ?>
    -------------------------------------------
    我也只能写个有中国特色的了,唉!国外的情况都不是很清楚了!程序写得很烂,大家尽管修改。
    ps:唠叨老大,还是希望你能够写个正则出来,也好让大家好好学习一下。
      

  5.   

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

  6.   

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