来自C#中URL的顶级域名

我正在使用C#和ASP.NET。

我们在IIS 6.0服务器上收到很多“奇怪”的请求,我想按域记录和编目。

例如。 我们收到一些奇怪的请求,比如:

http://www.poker.winner4ever.example.com/

http://www.hotgirls.example.com/

http://santaclaus.example.com/

http://m.example.com/

http://wap.example.com/

http://iphone.example.com/

后三者有点显而易见,但我想把它们全部整理成一个“example.com”IS托管在我们的服务器上。 其余的不是,抱歉:-)

所以我正在寻找一些如何从上面检索example.com的好主意。 其次,我想将m。,wap。,iphone等匹配到一个组中,但这可能只是在移动快捷键列表中快速查找。我可以手动编码此列表作为开始。

但是regexp这里的答案还是纯粹的字符串操作最简单的方法? 我在考虑用“。”将URL字符串“拆分”。 以及项目[0]和项目[1]的查找…

有任何想法吗?

我需要相同的,所以我写了一个类,你可以复制并粘贴到你的解决方案中。 它使用tld的硬编码字符串数组。 http://pastebin.com/raw.php?i=VY3DCNhp

Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.com/path/page.htm")); 

输出microsoft.com

 Console.WriteLine(GetDomain.GetDomainFromUrl("http://www.beta.microsoft.co.uk/path/page.htm")); 

输出microsoft.co.uk

以下代码使用Uri类获取主机名,然后通过在句点上拆分主机名从Uri.Host获取第二级主机( Uri.Host )。

 var uri = new Uri("http://www.poker.winner4ever.examplecompany.com/"); var splitHostName = uri.Host.Split('.'); if (splitHostName.Length >= 2) { var secondLevelHostName = splitHostName[splitHostName.Length - 2] + "." + splitHostName[splitHostName.Length - 1]; } 

如果没有不同域级别的最新数据库,这是不可能的。

考虑:

 s1.moh.gov.cn moh.gov.cn s1.google.com google.com 

那么你想在哪个级别获得域名? 它完全取决于TLDSLDccTLD ……因为ccTLD处于国家控制之下,他们可能会定义非常特殊的SLD ,而您不了解这些SLD

可能存在一些示例,其返回除所需内容之外的内容,但国家代码是唯一的2个字符,并且它们可能具有或不具有通常使用的短二级(2或3个字符)。 因此,在大多数情况下,这将为您提供所需的内容:

 String GetRootDomain(String host) { String[] domains = host.Split('.'); if (domains.Length >= 3) { int c = domains.Length; // handle international country code TLDs // www.amazon.co.uk => amazon.co.uk if (domains[c - 1].Length < 3 && domains[c - 2].Length <= 3) return String.Join(".", domains, c - 3, 3); else return String.Join(".", domains, c - 2, 2); } else return host; } 

使用正则表达式:

 ^https?://([\w./]+[^.])?\.?(\w+\.(com)|(co.uk)|(com.au))$ 

这将匹配以您感兴趣的TLD结尾的任何URL。 根据需要扩展列表。 此外,捕获组将分别包含子域,主机名和TLD。

我编写了一个用于.NET 2+的库 ,以帮助选择URL的域组件。

更多详细信息在github上,但比以前的选项有一个好处是它可以自动从http://publicsuffix.org下载最新数据(每月一次),因此库的输出应该或多或少与Web浏览器用于建立域安全边界的输出(即相当不错)。

它还不完美但适合我的需求,不应该花很多工作来适应其他用例,所以如果你愿意,请分叉并发送拉取请求。

您可以使用以下nuget Nager.PublicSuffix包。

的NuGet

 PM> Install-Package Nager.PublicSuffix 

 var domainParser = new DomainParser(new WebTldRuleProvider()); var domainName = domainParser.Get("sub.test.co.uk"); //domainName.Domain = "test"; //domainName.Hostname = "sub.test.co.uk"; //domainName.RegistrableDomain = "test.co.uk"; //domainName.SubDomain = "sub"; //domainName.TLD = "co.uk"; 
 uri.Host.ToLower().Replace("www.","").Substring(uri.Host.ToLower().Replace("www.","").IndexOf('.')) 
  • 返回“.com”

    Uri uri = new Uri("http://stackoverflow.com/questions/4643227/top-level-domain-from-url-in-c");

  • 返回“.co.jp”表示Uri uri = new Uri("http://stackoverflow.co.jp");

  • 返回“.s1.moh.gov.cn”为Uri uri = new Uri("http://stackoverflow.s1.moh.gov.cn");

等等

非常简单的版本

  // for https://nb-no.facebook.com/blabla should return 'facebook.com' private static string GetTopLevelHost(Uri uri) { var host = uri.Host; var parts = host.Split("."); if (parts.Length > 2) { return string.Join('.', parts.TakeLast(2)).ToLower(); } return host.ToLower(); }