说我有此代码:
Uri uri = new Uri("www.xx.yy.co.uk/folder/whatever.html");
如何从C#中的Uri
获取xx
,yy
,co.uk
?我几乎尝试了Uri
类的每个属性,但没有找到任何相关的内容。
请注意,例如,com
和co.uk
都是单个字符串。
您发现Instroult System.URI不会打破URL的各种顶级(主机/域)部分。您要求的解析类型是非常具体的,因为.com
和.co.uk
不是URL中的等效组件(.com和.uk)。
自己做这件事的两种简单方法是:
-
修改已建立的正则是解析URI
Host
属性中持有的URL,并使用正则命名为captures(组)以方便地提取部分。 -
通过创建自己从中继承的system.uri类,并引入一种以您想要的特定方式分解URL的方法。
问题在于,有一个很大的"伪顶级域"列表,例如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();
}
背景:唯一的官方顶级领域只是.uk等一部分。这里提供了所有"伪顶级域"的全面列表:https://wiki.mozilla.org/tld_list。虽然这是一个大列表,但它似乎并不全面,因为许多国家仅列出了一个顶级领域,并且有"(其他?)"等领域。
这将适用于此问题。检查数组元素:
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();