【问题标题】:domain regex split域正则表达式拆分
【发布时间】:2011-02-10 21:54:47
【问题描述】:

我有一些想要拆分的域,但不知道正则表达式...

我有:

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

鉴于其中任何一个,我试图仅提取google。有什么想法吗?

【问题讨论】:

  • 你会根据什么规则从第三个示例中提取 google 而不是 co
  • 没错!我在“//”上尝试了一个正则表达式,但它没有用......也许需要双 preg_split?

标签: php regex


【解决方案1】:

你为什么要使用正则表达式?有很多原生函数可供您使用,例如:

$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

【讨论】:

  • 已更新,以编程方式检测域名,您不应尝试依赖正则表达式,因为它会变得非常依赖和混乱。
【解决方案2】:

您可以在最佳选择的基础上做到这一点。 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 列表。

【讨论】:

    【解决方案3】:

    这里的答案可能就是您想要的。

    Getting parts of a URL (Regex)

    【讨论】:

    • 也就是说,正则表达式非常占用内存。我猜 parse_url();与我发布的正则表达式链接相比,资源消耗要少得多。
    【解决方案4】:
    $res = preg_replace("/^(http:\/\/)([a-z_\-]+\.)*([a-z_\-]+)\.(com|co.uk|net) \/.*$/im", "\$3", $in );

    添加尽可能多的结尾

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-05
      • 2013-08-11
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多