get_domain()在處理爬蟲數據、鏈接分析、安全審計時,常需從任意 URL 字符串中解析出「註冊級域名」(如 example.com、example.co.uk)。本文提供一個健壯的函數,兼容多級後綴(.com.cn、.org.hk 等)、IP 地址、帶端口/路徑的 URL。
parse_url() 解析 Host。com.cn、net.cn、org.cn、gov.cn 等),動態計算主域名層級。<?php
/**
* 從 URL 中提取主域名(含子域名)
* @param string $url 目標 URL
* @return string 域名 (如: www.example.com, example.co.uk) 或空字符串
*/
function get_domain($url) {
// 1. 正則快速匹配常見模式
$pattern = '/[a-z0-9-]+(\.[a-z0-9-]+)*\.(com|net|org|gov|cc|biz|info|cn|co|me|io|tv)(?:\.(cn|hk|tw|jp|uk))?/i';
if (preg_match($pattern, $url, $matches)) {
return strtolower($matches[0]);
}
// 2. 結構化解析
$parsed = parse_url($url);
if (empty($parsed['host'])) return '';
$host = strtolower($parsed['host']);
// 3. IP 地址直接返回
if (filter_var($host, FILTER_VALIDATE_IP)) return $host;
// 4. 多級後綴列表 (需根據實際業務維護)
$tlds = [
'com.cn', 'net.cn', 'org.cn', 'gov.cn', 'edu.cn',
'com.hk', 'org.hk', 'net.hk',
'com.tw', 'org.tw',
'co.uk', 'org.uk', 'me.uk',
'com.au', 'net.au', 'org.au',
// 單級後綴作為兜底
'com', 'net', 'org', 'gov', 'edu', 'io', 'co', 'me', 'tv', 'cn', 'cc', 'biz', 'info'
];
$parts = explode('.', $host);
$count = count($parts);
if ($count < 2) return $host; // 如 localhost
// 從後向前匹配最長後綴
for ($i = $count - 1; $i >= 1; $i--) {
$suffix = implode('.', array_slice($parts, $i));
if (in_array($suffix, $tlds)) {
// 找到後綴,主域名至少包含前一級
$start = max(0, $i - 1);
return implode('.', array_slice($parts, $start));
}
}
// 5. 默認策略:取最後兩級
return implode('.', array_slice($parts, -2));
}
// --- 測試用例 ---
$tests = [
'https://blog.csdn.net/article/123',
'https://www.google.co.uk/search?q=php',
'https://192.168.1.1:8080/admin',
'https://sub.domain.example.com.cn/path',
'ftp://user:pass@localhost/folder',
'https://example.com',
'https://example.co.uk',
];
foreach ($tests as $url) {
echo "URL: $url\nDomain: " . get_domain($url) . "\n\n";
}
?>
parse_url() 獲取 host 組件,避免正則處理協議、端口、認證信息的複雜性。TLDExtract 庫),而非硬編碼後綴數組,以準確處理 github.io、appspot.com 等特殊後綴。idn_to_ascii() 轉換為 Punycode 處理。友鏈檢測、同站鏈接識別、Cookie 域設置、安全策略域名白名單匹配等。