Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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/regex/16.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
.net 如何从URL中提取第一个文件夹?_.net_Regex - Fatal编程技术网

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

.net 如何从URL中提取第一个文件夹?,.net,regex,.net,Regex,我需要改进下面的方法 其思想是提取URL的第一个文件夹(如果存在)。URL可以通过域传递,也可以不通过域传递,也就是说,http://www.examplecom/es/test/test.aspx,http://example.com/es/test/,或者干脆/us/xxx/xxx.aspx public string ExtractURL(string url) { string result = ""; try { string[] urlSpli

我需要改进下面的方法

其思想是提取URL的第一个文件夹(如果存在)。URL可以通过域传递,也可以不通过域传递,也就是说,
http://www.examplecom/es/test/test.aspx
http://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;
}
考虑使用类预解析Uri并使用LocalPath属性提取相对路径。然后使用String.split()。

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

我想这应该是你想要的


这应该可以满足您的要求,我认为我同意Sergii Volchkov的观点,我认为使用System.Uri是正确的选择,但是您可能需要使用Path.GetParentDirectory()来代替string.split在本地路径上。

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

强制转换为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;
}

强制转换为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;
}

如果要使用正则表达式解决此问题(将问题标记为“regex”),请尝试以下方法:

public string ExtractURL(string url)
{
  return Regex.Match(url, "(?<!/)/[^/?#]+").Value;
}
public string ExtractURL(string url)
{
  Regex.Match(url, @"(\w*:(//[^/?#]+)?/)?(?<folder>[^/?#]+)").Groups["folder"].Value;
}
公共字符串提取url(字符串url)
{
返回Regex.Match(url,(?[^/?#]+))”.Groups[“folder”].Value;
}

如果您想用正则表达式解决这个问题(当您将问题标记为“regex”时),请尝试以下方法:

public string ExtractURL(string url)
{
  return Regex.Match(url, "(?<!/)/[^/?#]+").Value;
}
public string ExtractURL(string url)
{
  Regex.Match(url, @"(\w*:(//[^/?#]+)?/)?(?<folder>[^/?#]+)").Groups["folder"].Value;
}
公共字符串提取url(字符串url)
{
返回Regex.Match(url,(?[^/?#]+))”.Groups[“folder”].Value;
}

很抱歉,您不能将段用于相对URL,并且属性计数不存在,它是长度。重要的问题是第一个。添加一个相对路径的检查,你就是黄金。修正了这个例子来反映这一点。我认为不能将段用于相对URL。谢谢。这不再是一个相对Url,因为它是由webAddress=newURI(Request.Url,Url)生成的一个绝对Url;好的,这是真的,它是一个绝对的url,哎呀!,我更喜欢正则表达式解决方案,因为转换为绝对url来提取部分效率不高,但我指出这个答案,因为这是另一个非常好的方法。对不起,您不能将段用于相对url,并且属性计数不存在,它是长度。重要的问题是第一个。添加一个相对路径的检查,你就是黄金。修正了这个例子来反映这一点。我认为不能将段用于相对URL。谢谢。这不再是一个相对Url,因为它是由webAddress=newURI(Request.Url,Url)生成的一个绝对Url;好的,这是真的,它是一个绝对的url,哎呀!,我更喜欢正则表达式解决方案,因为转换为绝对url来提取一个部分效率不高,但我指出了这个答案,因为这是另一个非常好的方法。这个方法不存在,有Path.GetPathRoot,但它不起作用哦,对不起,我是说使用“GetDirectoryName()”。您可能需要多次使用此方法才能访问第一个文件夹。此方法不存在,有Path.GetPathRoot,但不起作用。哦,对不起,我是说使用“GetDirectoryName()”。您可能需要多次使用此方法才能访问第一个文件夹。您还没有说明现在使用的方法有什么问题。什么不起作用?这个想法是让一些东西更压缩,正则表达式总是好的。你还没有说你现在的方法有什么问题。什么不起作用?我们的想法是让某些东西更压缩,正则表达式总是很好