【问题标题】:PHP URL Parsing & disectingPHP URL 解析和剖析
【发布时间】:2011-03-15 23:32:39
【问题描述】:
  • www.example.com
  • foo.example.com
  • foo.example.co.uk
  • foo.bar.example.com
  • foo.bar.example.co.uk

我有这些网址,并希望始终以 2 个变量结束:

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

如果有人可以让我从 $url 作为 url 之一,一直到 $newUrl 接近“example.co.uk”,那将是一种祝福。

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

干杯,

【问题讨论】:

  • 这里的标题有点误导。您正在解析域名,而不是看起来像的 URL。基本上,这归结为寻找一个 TLD 数据库及其相关的二级国家代码,如 uk 和 au。没有这些信息就没有办法解决这个问题。
  • 所以这里是重复的:stackoverflow.com/questions/4963202/domain-regex-split - 你想看看 RobertPitts solution as alternative. As said, it can be done on a best bet basis. You can't even get reliable results with TLD probing ala dig +all co.uk`

标签: php url


【解决方案1】:

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

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

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

【讨论】:

  • 是的,让我感到惊讶的是,关于这个问题并没有太多发现——作为 php 的相对新手(javascript、css 和 html 是我的首选武器),它看起来相当初级。 .edit:感谢您的回复。不过,还没有足够的信用来投票。 '对不起我。
  • 它会搞砸像nic.uk 这样的东西。实际上,您可能需要维护 uk 等有效二级域的完整列表。
  • 这很好也很简单,所以 +1。我可能遗漏了一些东西,但你需要最后一个可选的.\.?)吗?
  • @myself,我想有人会争辩说 www 是域,而 nic.uk 是 TLD。真正取决于上下文的正确程度。
  • @konforce 我什至会忽略它作为特殊情况,或者将其列入黑名单 (?!nic),但明确的列表 (\w+|co.uk|net.uk|com.au|org.au) 确实是最可靠的。
【解决方案2】:

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

每个国家/地区都有自己的顶级域名,一些国家/地区选择进一步细分其顶级域名。并且由于子域(my.own.subdomain.example.com)的数量也是可变的,所以没有简单的“one-regexp-fits-all”。

如前所述,您需要一份清单。幸运的是,有一些公开可用的列表:http://publicsuffix.org/

【讨论】:

  • 将此标记为最佳答案,因为它最彻底地解决了我的问题。干杯。
【解决方案3】:

您需要维护一个扩展列表以获得最准确的结果。

$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.

【讨论】:

  • 这不会返回 TLD 的密钥。
  • @vicTROLLA parse_url() 是您可能想要使用的开始,尤其是当它们包含路径、参数和/或片段时。
  • 我最终在我的解决方案中使用了很多您的概念(也已发布)-谢谢。
【解决方案4】:

没有用于此的内置函数。

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

这让我相信您需要维护一个有效 TLD 列表来拆分 URL。

【讨论】:

【解决方案5】:

好的,伙计们,这就是我现在解决的方法。在未来的某个时候,还将实施更多域名。还不知道我会使用什么技术。

# 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;
}

【讨论】:

  • 我到底在想什么。
猜你喜欢
  • 1970-01-01
  • 2020-01-08
  • 2017-05-31
  • 2012-12-19
  • 2013-05-25
  • 2011-08-01
  • 2010-12-03
  • 1970-01-01
相关资源
最近更新 更多