如何从URL中提取第一个文件夹?

时间:2009-07-31 07:23:20

标签: .net regex

我需要改进下面的方法。

想法是提取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;
}

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

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 :(得分:0)

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

答案 3 :(得分:0)

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

那应该做你想要的我认为

答案 4 :(得分:0)

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