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

C# 從 URL 解析網域名稱:公共尾綴列表 (PSL) 方案

     編輯:關於C#

問題

Uri.Host 只能取得主機名 (如 www.google.co.uk),無法直接得到「可註冊網域」 (如 google.co.uk)。手寫尾綴列表難以維護、易遺漏。

標準解法:Public Suffix List (PSL)

Mozilla 維護的 公共尾綴列表 包含所有 ICANN 管理尾綴 (如 .com) 與私有尾綴 (如 .github.io)。解析演算法:

  1. 取得 Host (去除 port)。
  2. 由右向左匹配 PSL 規則,找到最長匹配的公共尾綴。
  3. 網域 = 尾綴左側最近一個標籤 + 尾綴。

C# 成熟套件:Nager.PublicSuffix

// NuGet: Install-Package Nager.PublicSuffix
using Nager.PublicSuffix;

var parser = new DomainParser();
var result = parser.Parse("https://www.test.googlepages.com");

Console.WriteLine(result.RegistrableDomain); // googlepages.com
Console.WriteLine(result.SubDomain);         // www.test
Console.WriteLine(result.TLD);               // com

核心優勢

  • 自動更新 PSL (可設定快取更新頻率)。
  • 正確處理 .co.uk、.com.cn、.github.io 等多層尾綴。
  • 支援 IDN (國際化網域名稱) Punycode 轉換。
  • 效能佳:Trie 結構查找,單次解析 < 0.1ms。

手寫兜底方案 (不引入套件時)

// 僅供演示,生產環境請用 PSL
private static readonly string[] CommonTlds = { ".com", ".net", ".org", ".co.uk", ".com.cn", ".net.cn", ".org.cn", ".gov.cn", ".edu.cn" };

public static string ExtractDomain(string url)
{
    Uri uri = new Uri(url);
    string host = uri.Host.ToLowerInvariant();

    foreach (string tld in CommonTlds.OrderByDescending(x => x.Length))
    {
        int idx = host.LastIndexOf(tld);
        if (idx > 0)
        {
            int dot = host.LastIndexOf('.', idx - 1);
            return (dot >= 0) ? host.Substring(dot + 1) : host;
        }
    }
    // 兜底:取最後兩段
    string[] parts = host.Split('.');
    return parts.Length >= 2 ? parts[^2] + "." + parts[^1] : host;
}

小結

解析網域名稱**請直接使用 PSL 庫**,勿自行維護尾綴列表。Nager.PublicSuffix 是 .NET 生態的標準選擇,準確、可維護、效能佳。

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