顶级域和二级域可能有 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 个最常见的 TLD(com、org 等),我们有 383,616 种可能性——甚至没有添加整个 TLD 范围。 1 字母和 2 字母域名仍然存在,但以后不再有效。
在 google.com 中——“google”是“com”的子域
在 google.co.uk 中——“google”是“co”的子域,而后者又是“uk”的子域,或者实际上是二级域,因为“co”也是有效的顶级域级域
在 www.google.com 中——“www”是“google”的子域,是“com”的子域
“co.uk”不是有效的主机,因为没有有效的域名
假设这个函数在几乎所有情况下都会返回正确的“basedomain”,而不需要“url map”。
如果您碰巧是少数情况之一,也许您可以修改它以满足特定需求...
编辑:您必须将域字符串作为带有协议(http://、ftp:// 等)的 URL 传递,否则 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 询问的澳大利亚变体。它对内部使用很方便,但距离完整的域验证过程还有很长的路要走。如果您尝试以这种方式使用它,我建议您不要这样做,因为匹配无效域的可能性太多。