顶级域名和二级域名可以是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中,“google”是“co”的子域名,而“co”本身也是一个有效的顶级域名,实际上是一个二级域名。
在www.google.com中,“www”是“google”的子域名,而“google”又是“com”的子域名。
"co.uk"不是一个有效的主机,因为没有有效的域名。
按照这个假设,这个函数将在几乎所有情况下返回正确的"basedomain",而无需需要一个"url map"。
如果你恰好是少数情况之一,也许你可以修改它来满足特定的需求...
编辑:你必须将域字符串作为带有其协议(http://、ftp://等)的URL传递,否则
parse_url()
将不会将其视为有效的URL(除非你想修改代码以使其行为不同)。
function basedomain( $str = '' )
{
$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
打开此URL:http://data.iana.org/TLD/tlds-alpha-by-domain.txt
然后将行读入数组,并使用该数组比较域部分。
编辑:为允许澳大利亚域名:
function au_basedomain( $str = '' )
{
$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
,您感兴趣的是顶级域名和二级域名。对于google.co.uk
,您需要顶级域名和二级和三级域名。没有定义的“基本名称”,不同的注册机构/顶级域名意味着您所说的“基本名称”是不同的。 - deceze