C# 获取URI的一部分

C# 获取URI的一部分,c#,uri,C#,Uri,假设我有以下代码: Uri uri = new Uri("www.xx.yy.co.uk/folder/whatever.html"); 如何从C#中的Uri获取xx,yy,co.uk?我几乎尝试了Uri类的所有属性,但没有找到任何相关的属性 请注意,例如,com和co.uk都是一个字符串。正如您所发现的那样,内置System.Uri不会分解URL的各个顶级(主机/域)部分。您要求的解析类型非常具体,因为.com和.co.uk不是URL中的等效组件(.com和.uk是) 有两种简单的方法可以自

假设我有以下代码:

Uri uri = new Uri("www.xx.yy.co.uk/folder/whatever.html");
如何从C#中的
Uri
获取
xx
yy
co.uk
?我几乎尝试了
Uri
类的所有属性,但没有找到任何相关的属性


请注意,例如,
com
co.uk
都是一个字符串。

正如您所发现的那样,内置System.Uri不会分解URL的各个顶级(主机/域)部分。您要求的解析类型非常具体,因为
.com
.co.uk
不是URL中的等效组件(.com和.uk是)

有两种简单的方法可以自己做到这一点:

  • 修改用于解析Uri的
    Host
    属性中保存的URL的,并在正则表达式中使用以方便地提取部分

  • 通过创建您自己的继承类来扩展System.Uri类,并引入一个方法以您想要的特定方式分解URL


这将适用于此问题。检查数组元素:

 Uri uri = new Uri("http://www.xx.yy.co.uk/folder/whatever.html");
 string abs = uri.AbsoluteUri;

 char[] splitChar = { '.' };
 var nodesArray = abs.Split(splitChar).ToArray();

问题是有大量的“伪顶级域名”列表,如co.uk、wakayama.jp或edu.cn,甚至包括三个部分的“顶级域名”。在C#中,没有为所有这些对象建立的内置列表,因此我所看到的最佳解决方案是指定您期望的对象,并将它们分开,如下所示:

List<string> parts = null;
Uri uri = new Uri("http://www.xx.yy.co.uk/folder/whatever.html");
string s = uri.Host;
string[] twoLevelDomains = { "co.uk", "edu.cn" };
foreach(var twoLevelDomain in twoLevelDomains)
{
    if (s.EndsWith(twoLevelDomain))
    {
        parts = s.Replace("." + twoLevelDomain, "").Split('.').ToList();
        parts.Add(twoLevelDomain);
    }
}
if(parts == null) {
    parts = s.Split('.').ToList();
}
List parts=null;
Uri=新的Uri(“http://www.xx.yy.co.uk/folder/whatever.html");
字符串s=uri.Host;
字符串[]twoLevelDomains={“co.uk”,“edu.cn”};
foreach(twoLevelDomains中的var twoLevelDomain)
{
if(s.EndsWith(twoLevelDomain))
{
parts=s.Replace(“.”+twoLevelDomain“”).Split(“.”).ToList();
parts.Add(twoLevelDomain);
}
}
if(parts==null){
parts=s.Split('.').ToList();
}
背景:
唯一的官方顶级域名只是其中的一部分,比如.uk。此处提供了所有“伪顶级域”的综合列表:。虽然这是一个很大的列表,但它似乎还不全面,因为许多国家只列出了一个顶级域名,还有一些领域,如“(其他?)。

你想要TLD、二级域名和三级域名,那么?@Nathantugy我不确定这些域名的实际名称,这使得我的谷歌搜索非常困难,但我想我在找那些,是的,很好的交易。技巧主要是顶级域(TLD),因为有些TLD具有嵌入句点:例如co.uk。@Nathantugy,这就是为什么我不能简单地使用
字符串
类来完成它的原因,所以基本上可以列出所有
.com
.org
.co.uk
等是唯一的解决方案?@Shiro你不需要制作或保留列表。这可以在正则表达式中完成,但会很复杂。如果只在每个
上拆分
主机
,然后在结果数组中重新组合最后两个字符串(如果它们满足特定条件),则可能会更简单。请注意,有各种各样的域和ccTLD以及TLD组合,这将使事情变得非常复杂,因此最终前面提到的string.Split()可能是解决方法。请注意,从URI的角度来看,主机没有单独的组件。从DNS的角度来看,顶级域/次要域有其含义,但没有正式的方法来查看主机名并以某种方式找出哪个部分应该对应于“国家级”。。。有关TLD列表的可能位置,请参阅。这将为我提供
co
uk
而不是
co.uk