2015-05-06 2 views
1

Допустим, у меня есть этот код:Получение частей URI

Uri uri = new Uri("www.xx.yy.co.uk/folder/whatever.html"); 

Как я могу получить xx, yy, co.uk из Uri в C#? Я пробовал почти каждое свойство класса Uri, и я не нашел ничего подходящего.

Обратите внимание, что, например, com и co.uk являются единственной строкой.

+0

Вы хотите, чтобы домен TLD, домен второго уровня и домен третьего уровня? –

+0

@NathanTuggy Я не уверен, что на самом деле они называются, что сделало мой поиск в Google очень тяжелым для этого, но я полагаю, что я ищу их, да – dimitris93

+0

Хорошая сделка. Трюк в основном относится к домену верхнего уровня (TLD), поскольку некоторые TLD имеют встроенные периоды: например, co.uk. –

ответ

1

Как вы обнаружили, встроенный System.Uri не разбивает части верхнего уровня (хоста/домена) URL-адреса. Тип синтаксического анализа, который вы запрашиваете, весьма специфичен, поскольку .com и .co.uk не являются эквивалентными компонентами в URL-адресе (.com и .uk).

Два простой способ сделать это сам:

  • изменить established regex для разбора URL проводится в Host собственности Ури, и использовать named captures (groups) в регулярном выражении удобно извлекать части.

  • Расширьте класс System.Uri, создав свой собственный, который наследует от него, и введите метод, который разбивает URL-адрес определенным образом.

+0

. Таким образом, в основном сделать список всех' .com'' .org'' .co.uk' и т. Д. Является единственным решение ? – dimitris93

+0

@Shiro Вам не нужно делать или хранить список. Это можно сделать в регулярном выражении, но это будет сложно. Это может быть проще, если вы просто разделите 'Host' на каждом' .', а затем перекомпилируете последние две строки в результирующем массиве, если они удовлетворяют определенному условию. Обратите внимание, что возможны всевозможные комбинации доменов и ccTLD и TLD, которые сделают вещи очень сложными, так что в конечном итоге вышеупомянутая строка .Split() может быть путем. – slugster

+2

Обратите внимание, что с точки зрения URI хост не имеет отдельных компонентов.Домен верхнего уровня/вторичный домен имеет смысл с точки зрения DNS, но нет официального способа взглянуть на имя хоста и каким-то образом выяснить, какая часть должна соответствовать «уровню страны» ... См. Http://stackoverflow.com/ questions/14427817/list-of-all-top-level-domains для возможного размещения списка TLD –

-1

Это будет работать по этой проблеме. Изучить элементы массива:

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(); 
+0

Это даст мне 'co'' uk' not' co.uk' – dimitris93

1

Проблема заключается в том, что есть очень большие списки «доменов псевдо верхнего уровня», таких как 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. Хотя это большой список, он по-прежнему не кажется исчерпывающим, поскольку многие страны перечислены только с одним верхним доменом, и есть такие поля, как «(другие?)».

Смежные вопросы