我在这里有这些URL,并希望总是最终得到2个变量:
$domainName = "example"
$domainNameSuffix = ".com" OR ".co.uk"
如果我有人能从$ url那里得到我作为其中一个网址,一直到$ newUrl接近“example.co.uk”,那将是一种祝福。
请注意,网址将完全“随机”,我们也可能最终拥有“foo.bar.example2.com.au”,所以......你知道......呃。 (要求不可能?)
干杯,
答案 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://
添加和删除。
答案 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;
}