域正则表达式拆分

时间:2011-02-10 21:54:47

标签: php regex

我有一些域名要分割,但无法弄清楚正则表达式...

我有:

  • http://www.google.com/tomato
  • http://int.google.com
  • http://google.co.uk

鉴于其中任何一项,我只想提取google。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

为什么要尝试使用正则表达式?有很多本机功能可供您使用,例如:

$host = parse_url($url, PHP_URL_HOST);

更新,给它一个去,它可能需要改进,但它比Regex imo

更好
function determainDomainName($url)
{
    $hostname = parse_url($url, PHP_URL_HOST);
    $parts = explode(".",$hostname);

    switch(count($parts))
    {
        case 1:
             return $parts[0]; //has to be a .com etc
        break;
        case 2:
            if($parts[1] == "www") //The most common subdomain
            {
                return $parts[2]; //Bypass Subdomain / return next segment
            }

            if($parts[2] == "co") //Possible in_array here for multiples, but first segment of double barrel tld
            {
                return $parts[1]; //Bypass double barrel tld's
            }
        break;
        default:
            //Have a guess
            //I bet the longest word is the domain :)
            usort($parts,"mysort");
            return $parts[0];

            /*
            here we just order the array by the longest word
            so google will always come above the following
            com,co,uk,www,cdn,ww1,ww2 etc
            */
        break;
    }
}

function mysort($a,$b){
    return strlen($b) - strlen($a);
}

将以下2个功能添加到您的库等。

然后像这样使用:

$urls = array(
    'http://www.google.com/tomato',
    'http://int.google.com',
    'http://google.co.uk'
);

foreach($urls as $url)
{
    echo determainDomainName($url) . "\n";
}

他们都会回复google

请参阅@ http://codepad.org/pA5KWckb

答案 1 :(得分:0)

这里的答案可能就是你要找的东西。

Getting parts of a URL (Regex)

答案 2 :(得分:0)

$res = preg_replace( "/^(http:\/\/)([a-z_\-]+\.)*([a-z_\-]+)\.(com|co.uk|net)\/.*$/im", "\$3", $in );

添加尽可能多的结局

编辑:犯了一个错误: - (

答案 3 :(得分:0)

您可以在最佳投注基础上执行此操作。 URL的最后一部分始终是TLD(和可选的根)。你基本上在寻找超过2个字母的任何前面的单词:

$url = "http://www.google.co.uk./search?q=..";

preg_match("#http://
            (?:[^/]+\.)*       # cut off any preceeding www*
            ([\w-]{3,})        # main domain name
            (\.\w\w)?          # two-letter second level domain .co
            \.\w+\.?           # TLD
            (/|:|$)            # end regex with / or : or string end
            #x", 
      $url, $match);

如果您期望更长的二级域名(.com可能?),请添加另一个\w。但这不是很通用,如果允许,你实际上需要一个TLD列表。