Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅从给定URL中的主机名获取前缀_C#_String_Winforms_Url - Fatal编程技术网

C# 仅从给定URL中的主机名获取前缀

C# 仅从给定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没有顶级域名后缀的域名

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.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));
      }