C# 仅从给定URL中的主机名获取前缀
我需要得到一个给定的url没有顶级域名后缀的域名 e、 gC# 仅从给定URL中的主机名获取前缀,c#,string,winforms,url,C#,String,Winforms,Url,我需要得到一个给定的url没有顶级域名后缀的域名 e、 g Url:www.google.com然后输出=google Url:http://www.google.co.uk/path1/path2然后输出=google Url:http://google.co.uk/path1/path2然后输出=google Url:http://google.com然后输出=google Url:http://google.co.in然后输出=google Url:http://mail.google.
- Url:
然后输出=www.google.com
google
- Url:
然后输出=http://www.google.co.uk/path1/path2
google
- Url:
然后输出=http://google.co.uk/path1/path2
google
- Url:
然后输出=http://google.com
google
- Url:
然后输出=http://google.co.in
google
- Url:
然后输出=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
的专业url)。在那之后,我没有搜索谷歌,并试图解决它,但它的帮助较少。我也看到了关于stackoverflow的问题,但它对我不起作用。这是你能得到的最好的。它不是可维护的解决方案,也不是“快速”解决方案。(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
我已经用下面的正则表达式对你的所有案例进行了测试,它是有效的
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
stringurl=”http://www.google.co.uk/path1/path2";
Regex rgx=新的Regex(@“(http(s?:/)?(www.)((?*?)\){1}([\w]+\.?)+”);
Match MatchResult=rgx.Match(url);
string result=MatchResult.Groups[“content”].Value//谷歌
这个答案只是为了完整性,因为我认为这是一个有效的方法,如果它不会如此复杂,并且基本上不会滥用DNS系统的话。请注意,这也不是100%万无一失(并且需要访问DNS)
- 提取URL的完整域名。让我们看
作为示例。我们将得到http://somepart.subdomain.example.org/some/files
somepart.subdomain.example.org
- 在点处拆分域名:
{“somepart”、“subdomain”、“example”、“org”}
- 取最右边的部分(
),看看它是否是一个已知的(顶级)域名。org
- 如果是,左边的下一部分就是您要查找的域名
- 如果不是,请尝试为此检索IP
- 如果有IP,最后添加的部分是你的域名
- 如果也没有IP,则将下一部分添加到左侧并重复这些检查(在本例中,您现在要测试
)example.org
- 你的问题的正确答案是:不,你不能
唯一一个几乎可以通过脏的、不易维护的方法来实现的解决方案是拥有一个包含所有现有TopLevelDomain的列表(你可以在这里找到一个不完整的列表)
var allTld=new[]{.com“,.it”,.co.uk}//在这里,您可以找到一个非常大的TLD列表
字符串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=新uri(urlToCheck);
字符串域=string.Empty;
对于(int i=0;i-1)
{
domain=uri.Host.Substring(0,索引);
index=domain.LastIndexOf(“.”,StringComparison.Ordinal);
如果(索引>-1)
{
domain=domain.Substring(索引+1);break;
}
}
}
if(string.IsNullOrEmpty(域))
{
抛出新异常(string.Format(“缺少url{0}的TLD”,urlToCheck));
}
我想你应该问自己:我真的需要没有TLD的名称吗?你的术语不正确
google.co.uk
是主机名。据我所知,google
部分没有术语。@johnsa理解可能是我的错误,但我希望与我写的内容相同。@cbeckner很抱歉,您不能仔细阅读此问题。我想要什么作为输出,以及“C#中URL的顶级域”的答案是什么?我很抱歉。然而,使用这个问题的答案,你将能够分割输出并使用数组中的第一个元素来获得你需要的。我认为这个问题实际上是无法解决的,因为你本质上要求的是你能帮我在字符串中找到一个随机字符串吗。我以前也回答过类似的问题。你想要的“谷歌”是一个不存在的实体,你指的是一个域。实际上,域是“google.co.uk”、“google.com”等。由于URL在ie子域mail.google.com中的工作方式,您无法可靠地拆分字符串。发布的解决方案使用TLD的硬编码列表来查找“域”,随着TLD的不断添加,IMHO无法维护该域。是的,你是对的。但我只给出了示例url,而不是确切的url,它应该每次都更改,没有100%的动态方式,因为您无法真正确定TLD是否由一个或两个部分组成(除非您专门硬编码/命名所有您能想到的内容;但即使这样也不完美)。本例中的代码将用于任何没有子域或只使用已知子域(如www
)的URL。@Archit但在本例中,名称将等同于返回。comNow即使是心灵程序也无法解决它。@Archit这没有任何意义name
是TLD,而不是域本身?为什么mario.name
会返回name
和mario.com
mario
?-1不匹配子域与其他方法,这对未知(子)域或TLD不起作用。让我们假设您正在输入它http://l
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));
}