顶级域和二级域的长度可能为 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范围内添加。
在 google.com 中 - “google”是“com”的子域
在 google.co.uk 中 - “google”是“co”的子域,而“co”又是“uk”的子域,或者实际上是二级域,因为“co”也是一个有效的顶级域。
在 www.google.com 中 - “www”是“google”的子域,它是“com”的子域
“co.uk”不是有效的主机,因为没有有效的域名
按照这个假设,这个函数在几乎所有情况下都会返回正确的“baseomain”,而不需要“url map”。
如果您碰巧是罕见的情况之一,也许您可以对其进行修改以满足特定需求......
编辑:您必须将域字符串作为其协议(http://,ftp:// 等)的URL传递,否则不会将其视为有效的URL(除非您要修改代码以使其行为不同)parse_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 ) );
}
如果您需要准确使用或打开此URL:http://data.iana.org/TLD/tlds-alpha-by-domain.txtfopen
curl
然后将行读入数组,并使用它来比较域部分
编辑:允许澳大利亚域名:
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 ) );
}
重要附加说明:我不使用此函数来验证域。它是通用代码,我只用于从全局中提取运行它的服务器的基域,以便在各种内部脚本中使用。考虑到我只在美国境内的网站上工作过,我从未遇到过pjv询问的澳大利亚变体。它对于内部使用很方便,但它距离完整的域验证过程还有很长的路要走。如果您尝试以这种方式使用它,我建议不要这样做,因为匹配无效域的可能性太多。$_SERVER['SERVER_NAME']