我需要从URL获取域名.以下示例应全部返回google.com:
google.com
images.google.com
new.images.google.com
www.google.com
Run Code Online (Sandbox Code Playgroud)
同样,以下URL都应该返回google.co.uk.
google.co.uk
images.google.co.uk
new.images.google.co.uk
http://www.google.co.uk
Run Code Online (Sandbox Code Playgroud)
我对使用正则表达式犹豫不决,因为类似的东西domain.com/google.com会返回不正确的结果.
如何使用PHP获取顶级域名?这需要适用于所有平台和主机.
xil*_*il3 17
你可以这样做:
$urlData = parse_url($url);
$host = $urlData['host'];
Run Code Online (Sandbox Code Playgroud)
**更新**
我能想到的最好的方法是绘制您想要处理的所有TLD的映射,因为某些TLD可能很棘手(co.uk).
// you can add more to it if you want
$urlMap = array('com', 'co.uk');
$host = "";
$url = "http://www.google.co.uk";
$urlData = parse_url($url);
$hostData = explode('.', $urlData['host']);
$hostData = array_reverse($hostData);
if(array_search($hostData[1] . '.' . $hostData[0], $urlMap) !== FALSE) {
$host = $hostData[2] . '.' . $hostData[1] . '.' . $hostData[0];
} elseif(array_search($hostData[0], $urlMap) !== FALSE) {
$host = $hostData[1] . '.' . $hostData[0];
}
echo $host;
Run Code Online (Sandbox Code Playgroud)
顶级域和二级域可能长2个字符,但注册的子域长度必须至少为3个字符.
编辑:由于pjv的评论,我了解澳大利亚域名是一个例外,因为他们允许5个顶级域名作为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"的子域,后者又是"uk"的子域,或者是二级域名,因为"co"也是一个有效的顶级域名
在www.google.com中 - "www"是"google"的子域,它是"com"的子域
"co.uk"不是有效的主机,因为没有有效的域名
按照这个假设,这个函数几乎在所有情况下都会返回正确的"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 ) );
}
Run Code Online (Sandbox Code Playgroud)
如果您需要准确使用fopen或curl打开此URL: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 ) );
}
Run Code Online (Sandbox Code Playgroud)
重要补充说明:我不使用此功能来验证域.它是通用代码,我只用于从全局运行的服务器中提取基本域,$_SERVER['SERVER_NAME']以便在各种内部脚本中使用.考虑到我只在美国境内工作,我从未遇到过pjv所询问的澳大利亚变种.它对内部使用很方便,但距离完整的域验证过程还有很长的路要走.如果您尝试以这种方式使用它,我建议不要因为太多可能性来匹配无效域.
尝试使用:http : //php.net/manual/en/function.parse-url.php。这样的事情应该工作:
$urlParts = parse_url($yourUrl);
$hostParts = explode('.', $urlParts['host']);
$hostParts = array_reverse($hostParts);
$host = $hostParts[1] . '.' . $hostParts[0];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26488 次 |
| 最近记录: |