我需要获取没有给定网址的顶级域名后缀的域名。
e.g
网址:www.google.com
然后输出= google
网址:http://www.google.co.uk/path1/path2
然后输出= google
网址:http://google.co.uk/path1/path2
然后输出= google
网址:http://google.com
然后输出= google
网址:http://google.co.in
然后输出= google
网址:http://mail.google.co.in
然后输出= google
为此,我试试这段代码
var uri = new Uri("http://www.google.co.uk/path1/path2");
var sURL = uri.Host;
string[] aa = sURL.Split('.');
MessageBox.Show(aa[1]);
但每次我都无法获得正确的输出(没有www
的专业网址)。之后,我搜索没有谷歌,并尝试解决它,但它的帮助较少。我也看到了stackoverflow上的问题,但它对我不起作用。
答案 0 :(得分:1)
这个答案只是为了完整性,因为我认为这将是一种有效的方法,如果它不会那么复杂并且基本上滥用DNS系统。请注意,这也不是100%万无一失(并且需要访问DNS)。
http://somepart.subdomain.example.org/some/files
为例。我们得到somepart.subdomain.example.org
。{"somepart", "subdomain", "example", "org"}
。org
),看看它是否是已知的(顶级)域名。
example.org
)。答案 1 :(得分:1)
您的问题的正确答案是:不,你不能。
在脏和不易维护的方式中几乎可以实现的唯一解决方案是拥有包含所有现有TopLevelDomain的列表(您可以找到不完整的这个中有一个SO answer)
var allTld = new[] {".com", ".it",".co.uk"}; //there you have find a really big list of all TLD
string urlToCheck = "www.google.com";//sports-ak.espn.go.com/nfl/ http://www.google.co.uk/path1/path2
if (!urlToCheck.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{
urlToCheck = string.Concat("http://", urlToCheck);
}
var uri = new Uri(urlToCheck);
string domain = string.Empty;
for (int i = 0; i < allTld.Length; i++)
{
var index = uri.Host.LastIndexOf(allTld[i], StringComparison.OrdinalIgnoreCase);
if (index>-1)
{
domain = uri.Host.Substring(0, index);
index = domain.LastIndexOf(".", StringComparison.Ordinal);
if (index>-1)
{
domain = domain.Substring(index + 1);break;
}
}
}
if (string.IsNullOrEmpty(domain))
{
throw new Exception(string.Format("TLD of url {0} is missing", urlToCheck));
}
恕我直言你应该问问自己:我真的需要没有TLD的名字吗?
答案 2 :(得分:0)
这是你能得到的最好的。它不是一个可维护的解决方案,它不是一个“快速”的解决方案。 (GetDomain.GetDomainFromUrl
应该优化)。
TldPatterns.EXACT
添加"co.uk"
(我不知道为什么它首先不存在)这应该是什么样的:
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class TldPatterns
{
private TldPatterns()
{
// Prevent instantiation.
}
/**
* If a hostname is contained in this set, it is a TLD.
*/
static public string[] EXACT = new string[] {
"gov.uk",
"mil.uk",
"co.uk",
//...
public class Program
{
static void Main(string[] args)
{
string[] urls = new[] {"www.google.com", "http://www.google.co.uk/path1/path2 ", "http://google.co.uk/path1/path2 ",
"http://google.com", "http://google.co.in"};
foreach (var item in urls)
{
string url = item;
if (!Regex.IsMatch(item, "^\\w+://"))
url = "http://" + item;
var domain = GetDomain.GetDomainFromUrl(url);
Console.WriteLine("Original : " + item);
Console.WriteLine("URL : " + url);
Console.WriteLine("Domain : " + domain);
Console.WriteLine("Domain Part : " + domain.Substring(0, domain.IndexOf('.')));
Console.WriteLine();
}
}
}
输出:
Original : www.google.com
URL : http://www.google.com
Domain : google.com
Domain Part : google
Original : http://www.google.co.uk/path1/path2
URL : http://www.google.co.uk/path1/path2
Domain : google.co.uk
Domain Part : google
Original : http://google.co.uk/path1/path2
URL : http://google.co.uk/path1/path2
Domain : google.co.uk
Domain Part : google
Original : http://google.com
URL : http://google.com
Domain : google.com
Domain Part : google
Original : http://google.co.in
URL : http://google.co.in
Domain : google.co.in
Domain Part : google
答案 3 :(得分:0)
我已经使用以下Regex对您的所有案例进行了测试,但它确实有效。
string url = "http://www.google.co.uk/path1/path2";
Regex rgx = new Regex(@"(http(s?)://)?(www.)?((?<content>.*?)\.){1}([\w]+\.?)+");
Match MatchResult = rgx.Match(url);
string result = MatchResult.Groups["content"].Value; //google