Uri.Host 只能取得主機名 (如 www.google.co.uk),無法直接得到「可註冊網域」 (如 google.co.uk)。手寫尾綴列表難以維護、易遺漏。
Mozilla 維護的 公共尾綴列表 包含所有 ICANN 管理尾綴 (如 .com) 與私有尾綴 (如 .github.io)。解析演算法:
// 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
.co.uk、.com.cn、.github.io 等多層尾綴。// 僅供演示,生產環境請用 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 生態的標準選擇,準確、可維護、效能佳。