PHP URL解析&解剖

时间:2011-03-15 23:32:40

标签: php url

  • www.example.com
  • foo.example.com
  • foo.example.co.uk
  • foo.bar.example.com
  • foo.bar.example.co.uk

我在这里有这些URL,并希望总是最终得到2个变量:

$domainName = "example"
$domainNameSuffix = ".com" OR ".co.uk"

如果我有人能从$ url那里得到我作为其中一个网址,一直到$ newUrl接近“example.co.uk”,那将是一种祝福。

请注意,网址将完全“随机”,我们也可能最终拥有“foo.bar.example2.com.au”,所以......你知道......呃。 (要求不可能?)

干杯,

5 个答案:

答案 0 :(得分:3)

之前我们有过这样的问题,但我现在也找不到好的问题。关键是,这不可靠。您需要一长串特殊TLD(如.uk和.au),它们都有自己的.com / .net级别。

但作为一般方法和简单的解决方案,您可以使用:

preg_match('#([\w-]+)\.(\w+(\.(au|uk))?)\.?$#i', $domain, $m);
list(, $domain, $suffix) = $m;

答案 1 :(得分:2)

您需要维护一份扩展列表,以便我相信最准确的结果。

$possibleExtensions = array(
    '.com',
    '.co.uk',
    '.com.au'
);

// parse_url() needs a protocol.
$str = 'http://' . $str;

// Use parse_url() to take into account any paths
// or fragments that may end up being there.
$host = parse_url($str, PHP_URL_HOST);

foreach($possibleExtensions as $ext) {

    if (preg_match('/' . preg_quote($ext, '/') . '\Z/', $host)) {
       $domainNameSuffix = $ext;
       // Strip extension     
       $domainName = substr($str, 0, -strlen($ext));
       // Strip off http://           
       $domainName = substr($domainName, 7);
       var_dump($domainName, $domainNameSuffix);
       break;

    }

}

如果您没有任何路径或额外内容,您当然可以跳过parse_url()http://添加和删除。

It worked for all your tests

答案 2 :(得分:2)

“domainNameSuffix”被称为top level domain (tld for short),并没有简单的方法来提取它。

每个国家都拥有自己的领域,有些国家已经选择进一步细分他们的领域。而且由于子域(my.own.subdomain.example.com)的数量也是可变的,因此没有简单的“one-regexp-fits-all”。

如上所述,您需要一个清单。幸运的是,有公开列表:http://publicsuffix.org/

答案 3 :(得分:0)

没有内置功能。

快速谷歌搜索引导我http://www.wallpaperama.com/forums/php-function-remove-domain-name-get-tld-splitter-split-t5824.html

这使我相信您需要维护一份有效TLD列表以分割URL。

答案 4 :(得分:0)

好吧,这就是我现在解决的问题。在未来的某个时候,也将实施更多域名。不知道我会用什么技术。

# Setting options, single and dual part domain extentions
$v2_onePart = array(
                "com"
                );
$v2_twoPart = array(
                "co.uk",
                "com.au"
                );

$v2_url         = $_SERVER['SERVER_NAME'];      # "example.com"     OR  "example.com.au"
$v2_bits        = explode(".", $v2_url);        # "example", "com"  OR  "example", "com", "au"
$v2_bits        = array_reverse($v2_bits);      # "com", "example"  OR  "au", "com", "example"      (Reversing to eliminate foo.bar.example.com.au problems.)

switch ($v2_bits) {
    case in_array($v2_bits[1] . "." . $v2_bits[0], $v2_twoPart):
        $v2_class   = $v2_bits[2] . " " . $v2_bits[1] . "_" . $v2_bits[0];  # "example com_au"
        break;
    case in_array($v2_bits[0], $v2_onePart):
        $v2_class   = $v2_bits[1] . " " . $v2_bits[0];  # "example com"
        break;
}