Ниже приведен код, который будет содержать только расширение SLD плюс gTLD или ccTLD (обратите внимание на исключение ниже). Мне плевать на DNS.
Теория выглядит следующим образом:
- Все, что не превышает 3 токенов, остается неизменным, например. «localhost», «domain.com», в противном случае: последний токен должен быть расширением gTLD или ccTLD.
- Предпоследний токен считается частью расширения, если его длина <3 ИЛИ, если он включен в список исключений. </li>
- Наконец, токен до этого считается SLD. Все, что до этого считается поддоменом или определителем хоста, например, Www.
Что касается кода, короткий и сладкий:
private static string GetDomainName(string url)
{
string domain = new Uri(url).DnsSafeHost.ToLower();
var tokens = domain.Split('.');
if (tokens.Length > 2)
{
//Add only second level exceptions to the < 3 rule here
string[] exceptions = { "info", "firm", "name", "com", "biz", "gen", "ltd", "web", "net", "pro", "org" };
var validTokens = 2 + ((tokens[tokens.Length - 2].Length < 3 || exceptions.Contains(tokens[tokens.Length - 2])) ? 1 : 0);
domain = string.Join(".", tokens, tokens.Length - validTokens, validTokens);
}
return domain;
}
Очевидным исключением является то, что это не касается двухбуквенных доменных имен. Так что если вам повезло владеть ab.com, вам нужно немного адаптировать код. Для нас, простых смертных, этот код будет охватывать практически все рДВУ и нДВУ, за исключением нескольких очень экзотических.