顶级域名和二级域名的长度可能为2个字符,但注册的子域名的长度必须至少为3个字符。
编辑:由于pjv的评论,我了解到澳大利亚域名是一个例外,因为它们允许5个TLD作为SLD(com,net,org,asn,id)例如:somedomain.com.au。我猜com.au是“共享”的国家控制域名。所以,从技术上讲,“com.au”仍然是“基本域”,但这没有用。编辑:有47,952个可能的三字母域名(模式:[a-zA-Z0-9] [a-zA-Z0-9 - ] [a-zA-Z0-9]或36 * 37 * 36)与最常见的8种TLDS(com,org等)相结合,我们有383,616种可能性 - 甚至无需在TLD的整个范围内进行添加。 1个字母和2个字母的域名仍然存在,但不能继续使用。
在google.com
- “Google”对应的“COM”子域
在google.co.uk
- “谷歌”是“CO”,的一个子域这又是一个子域因为“co”也是有效的顶级域名
www.google.com - “www”是“google”的子域,它是一个子域“COM”的
“co.uk”不是一个有效的主机,因为没有有效的域名
与assumpt去在几乎所有情况下,该函数都会返回适当的“basedomain”,而不需要“url map”。
如果你碰巧是罕见的情况之一,也许你可以修改它以满足特定的需求...
编辑:你必须通过域名字符串作为URL与它的协议(http://,ftp://等)或parse_url()
不会认为它是一个有效的URL(除非你想修改代码的行为不同)
function basedomain($str = '')
{
// $str must be passed WITH protocol. ex: http://domain.com
$url = @parse_url($str);
if (empty($url['host'])) return;
$parts = explode('.', $url['host']);
$slice = (strlen(reset(array_slice($parts, -2, 1))) == 2) && (count($parts) > 2) ? 3 : 2;
return implode('.', array_slice($parts, (0 - $slice), $slice));
}
如果你需要准确运用fopen
或curl
打开这个网址: http://data.iana.org/TLD/tlds-alpha-by-domain.txt
然后读取行到一个数组,并使用该域的部分比较
编辑:允许澳大利亚域:
function au_basedomain($str = '')
{
// $str must be passed WITH protocol. ex: http://domain.com
$url = @parse_url($str);
if (empty($url['host'])) return;
$parts = explode('.', $url['host']);
$slice = (strlen(reset(array_slice($parts, -2, 1))) == 2) && (count($parts) > 2) ? 3 : 2;
if (preg_match('/\.(com|net|asn|org|id)\.au$/i', $url['host'])) $slice = 3;
return implode('.', array_slice($parts, (0 - $slice), $slice));
}
重要的附加说明:我不使用这个功能来验证域。这是通用代码,我只用它从全局$_SERVER['SERVER_NAME']
中提取它所运行的服务器的基本域,以用于各种内部脚本。考虑到我只在美国境内工作过,我从来没有遇到pjv问过的澳大利亚变种。这对于内部使用来说很方便,但是距离完整的域验证过程还有很长的路要走。如果您尝试以这种方式使用它,我建议不要因为与无效域名匹配的可能性太大。
这是棘手。对于'google.com',您对TLD和二级域名感兴趣。对于'google.co.uk',您需要TLD以及第二和第三级域名。没有定义的“基本名称”,对于不同的注册商/ TLD,“基本名称”的含义不同。 – deceze 2010-07-09 09:42:06
我非常确定你必须在这里有点长时间的啰嗦,你要求的是吃你的蛋糕并拥有它。如果没有TLD列表,则无法区分co.uk和google.com,它们都是主机名。 – 2010-07-09 09:43:07
我想你们是对的,它不看起来像任何东西都会工作没有很多的代码 – Rohan 2010-07-09 09:46:39