【问题标题】:How can I extract the first folder from a URL?如何从 URL 中提取第一个文件夹?
【发布时间】:2009-07-31 07:23:20
【问题描述】:

我需要改进下面的方法。

这个想法是提取 URL 的第一个文件夹(如果存在)。 URL 可以带或不带域传递,即http://www.examplecom/es/test/test.aspxhttp://example.com/es/test/ 或简单的/us/xxx/xxx.aspx

public string ExtractURL(string url)
{
    string result = "";
    try
    {
        string[] urlSplitted = url.Split("//".ToCharArray());
        //si encontramos /
        if (urlSplitted.Length > 0)
        {
            string strFin = urlSplitted[urlSplitted.GetUpperBound(0) - 1];
            //comprobamos que exista algo
            if (String.IsNullOrEmpty(strFin))
            {
                result = url;
            }
            else
            {
                //devuelvo la url hasta /ES o /EN
                result = url.Substring(0,url.ToLower().IndexOf("/" +strFin.ToLower()));
            }
        }
        else
        {
            result = url;
        }
    }
    catch
    {
        result = "";
    }
    return result;
}

【问题讨论】:

  • 你还没有说你现在的方法有什么问题。什么不工作?
  • 我们的想法是压缩更多的东西,正则表达式总是很好

标签: .net regex


【解决方案1】:

如果你想用正则表达式解决这个问题(当你标记你的问题“正则表达式”),试试这个:

public string ExtractURL(string url)
{
  return Regex.Match(url, "(?<!/)/[^/?#]+").Value;
}

此正则表达式适用于绝对 URL,以及以斜杠开头的相对 URL。如果它还需要处理不带斜线的相对 URL,请尝试以下操作:

public string ExtractURL(string url)
{
  Regex.Match(url, @"(\w*:(//[^/?#]+)?/)?(?<folder>[^/?#]+)").Groups["folder"].Value;
}

【讨论】:

    【解决方案2】:

    转换为 Uri,然后使用 Segments 属性。您实际上需要第二段,因为第一段只是前导斜杠。

    public string ExtractURL(string url)
    {
        Uri webAddress = null;
        string firstFolder = null;
        if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out webAddress))
        {
            if (!webAddress.IsAbsoluteUri)
            {
                webAddress = new Uri(Request.Url, url);
            }
            if (webAddress.Segments.Length >= 2)
            {
                firstFolder = webAddress.Segments[1];
            }
        }
        return firstFolder;
    }
    

    【讨论】:

    • 抱歉,相对 url 不能使用段,并且属性 Count 不存在,它是长度。重要的问题是第一个。
    • 是的。添加对相对路径的检查,您就可以了。固定示例以反映这一点。
    • 我认为您不能将 Segments 用于相对 url。谢谢。
    • 这不再是一个相对的Url,因为它已经被webAddress = new Uri(Request.Url, url); 变成了一个绝对的url;
    • 好的,这是真的,它是一个绝对网址,哎呀!,我更喜欢正则表达式解决方案,因为转换为绝对网址来提取部分不是那么有效,但我指出这个答案,因为它是另一个非常好的方法。
    【解决方案3】:

    考虑使用 System.Uri 类来预解析 Uri 并使用 LocalPath 属性提取相对路径。然后使用 String.split()。

    【讨论】:

      【解决方案4】:
      public string ExtractURL(string URL)
          {
              string result = "";
              try
              {
                  httpindex = URL.ToLower().IndexOf("http://");
                  if (httpindex > 0)
                  {
                      URL = URL.Substring(0, 6);
                  }
                  URL = URL.ToLower().TrimStart("http://".ToCharArray());
                  string[] urlArray = URL.Split('/');
                  if (urlArray.Length > 1)
                  {
                          result = urlArray[1];
                  }
              }
              catch
              {
                  result = "";
              }
              return result;
          }
      

      我认为这应该是你想要的

      【讨论】:

        【解决方案5】:

        我同意 Sergii Volchkov 的观点,我认为使用 System.Uri 是正确的方法,但您可能希望在本地路径上使用 Path.GetParentDirectory() 而不是使用 string.split。

        【讨论】:

        • 这个方法不存在,有Path.GetPathRoot但是不行
        • 哎呀抱歉我的意思是使用“GetDirectoryName()”。您可能需要多次使用此方法才能到达第一个文件夹。
        猜你喜欢
        • 2012-08-17
        • 2018-08-26
        • 1970-01-01
        • 2019-08-15
        • 2022-08-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        相关资源
        最近更新 更多