首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP從URL字符串中精確提取主域名/子域名方法

     編輯:PHP 相關知識

PHP 正則提取域名核心函數 get_domain()

在處理爬蟲數據、鏈接分析、安全審計時,常需從任意 URL 字符串中解析出「註冊級域名」(如 example.com、example.co.uk)。本文提供一個健壯的函數,兼容多級後綴(.com.cn、.org.hk 等)、IP 地址、帶端口/路徑的 URL。

核心算法邏輯

  1. 正則預匹配:優先嘗試匹配常見頂級域後綴模式。
  2. parse_url 兜底:正則失敗時,用 PHP 內置 parse_url() 解析 Host。
  3. IP 判斷:若 Host 為 IP 地址,直接返回。
  4. 多級後綴處理:維護已知雙級後綴列表(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";
}
?>

關鍵點總結

  • 不要造輪子解析 URL:優先使用 parse_url() 獲取 host 組件,避免正則處理協議、端口、認證信息的複雜性。
  • 公共後綴列表 (PSL):生產環境強烈建議引入 Public Suffix List(如使用 TLDExtract 庫),而非硬編碼後綴數組,以準確處理 github.io、appspot.com 等特殊後綴。
  • IDN 域名:涉及中文域名時,需配合 idn_to_ascii() 轉換為 Punycode 處理。

應用場景

友鏈檢測、同站鏈接識別、Cookie 域設置、安全策略域名白名單匹配等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved