【问题标题】:Split string (path of Uri) based on "/"根据“/”拆分字符串(Uri 的路径)
【发布时间】:2013-07-01 20:28:50
【问题描述】:

想知道是否有人能指出我正确的方向。我想要实现的是根据其中包含“/”的字符串来拆分字符串。例如,如果我有: www.site.com/course/123456/216 in code (c#) 我希望能够在代码中拆分字符串,以便可以将 123456 分配给变量 param1 并将 216 分配给 param2 (当然是页面的“友好”名称)。如果我要在字符串上添加第三个“/”,我希望它成为 param3 等。

理想情况下,我希望能够将此代码放在某个地方,以便我可以将它包含在我需要它工作的任何用户控件中。

【问题讨论】:

  • 这是非常规的,但肯定是可行的。您可以从Request 对象中获取原始 URL(以及有关它的各种信息)。那时你有一个字符串,你可以用“/”分割它并用它做任何你喜欢的事情。
  • 那些不是查询字符串......那些是子目录。另外为什么你想要无用的变量?使用数组。
  • 您给出的示例 (www.site.com/course/123456/216) 是 URL,而不是查询字符串 (www.site.com/course?param1=123456&param2=216)。
  • 拆分功能有什么问题?
  • @newStackExchangeInstance:它们也不是子目录 :) 整件事就是一个“资源标识符”。

标签: c# asp.net query-string


【解决方案1】:

Uri.Segments也许是你要找的东西:

new Uri("http://www.contoso.com/foo/bar/index.htm#search").Segments

[ "/", "foo/", "bar/", "index.html" ] 中的结果

【讨论】:

  • 如果你总是要在 / 上分割,你可以使用分段。喜欢HttpContext.Current.Request.Url.Segments.Select(x=>x.TrimEnd('/')).Skip(2).ToArray()
  • 大家好,只是为了让你们知道我已经被拖到另一个项目中,所以我将在接下来的几天内尝试这些建议。干杯的人
  • 提供的链接重定向到 uri 片段,而不是片段
【解决方案2】:

为什么不直接使用拆分?

var valueArray = "www.site.com/course/123456/216".Split('/');

数组会将整个字符串分解

索引 0 将是“www.site.com”等等。

【讨论】:

  • 因为那不是有效的 C#。
  • 你说的是案子吗?
  • 我刚刚测试过,至少在Javalsu的最后一版之后,它是完全有效的。
  • 给定 url of server/func2/SubFunc2 // 获取路径组件。尾随分隔符。返回 {“/”、“func2/”、“sunFunc2”}。 string[] pathsegments = myUri.Segments;
【解决方案3】:
HttpContext.Current.Request.Url.AbsolutePath.Split('/')

【讨论】:

  • 几乎可以从任何地方访问,包括静态类、过滤器等。
  • 这会将您的友好名称(课程)放在元素 0 中,将 123456 放在元素 1 中,将 216 放在元素 2 中,如果存在则将您的可选参数放在元素 3 中。我可以向您展示如何删除第一个,但最简单的方法是:var x=new List<string>(above); x.RemoveAt(0);var x=new Queue<string>(above); x.Dequeue();
  • 如果您可以使用 LINQ,那么以下内容会更短:HttpContext.Current.Request.Url.AbsolutePath.Skip(1).ToArray()
  • 抱歉,忘记了HttpContext.Current.Request.Url.AbsolutePath.Split('/').Skip(1).ToArray()的拆分。您也可以使用这些段,例如 HttpContext.Current.Request.Url.Segments.Select(x=>x.TrimEnd('/')).Skip(2).ToAr‌​ray()
  • 给定 url of server/func2/SubFunc2 // 获取路径组件。尾随分隔符。返回 {“/”、“func2/”、“sunFunc2”}。 string[] pathsegments = myUri.Segments;
【解决方案4】:

好吧,假设这些值不会包含/

var splitVals = queryString.Split('/');
var vals = new Dictionary<string, string>();
for (int i = 2; i <= splitVals.Count; i++)
{
    vals.Add(string.Format("param{0}", i), vals[i]);
}

这会让你开始。现在,如果您希望将它们设置为实变量,那么您需要进行一些转换并利用反射,但您的问题还不够清楚,无法在那里做出任何真正的假设。

编辑

为了使这段代码可重用,我将构建一个扩展方法:

namespace System
{
    public static class StringExtensions
    {
        public static Dictionary<string, string> SplitQueryString(this string queryString)
        {
            var splitVals = queryString.Split('/');
            var vals = new Dictionary<string, string>();
            for (int i = 2; i <= splitVals.Count; i++)
            {
                vals.Add(string.Format("param{0}", i), vals[i]);
            }

            return vals;
        }
    }
}

因为那时你可以这样做:

var vals = queryString.SplitQueryString();

【讨论】:

  • 小错字:你用的是 parm 而不是 param。
  • 哇!感谢所有的回复!我正在考虑使用 split 功能,但我不确定是否有其他(更好的)方法可以实现我所追求的。我会狂欢,让你们都知道我是怎么过的。另外作为一个子点,使这段代码可重用的最佳方法是什么?再次感谢您的所有时间。克雷格
  • 给定 url of server/func2/SubFunc2 // 获取路径组件。尾随分隔符。返回 {“/”、“func2/”、“sunFunc2”}。 string[] pathsegments = myUri.Segments;
【解决方案5】:

http://msdn.microsoft.com/en-us/library/b873y76a.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

string QueryString = "1234/567/890"; string[] QueryArray = QueryString.Split('/');

现在QueryArray[0] = 1234QueryArray[1] = 567QueryArray[2] = 890

【讨论】:

  • (char)47 似乎有点矫枉过正。为什么不只是'/'
  • 请注意,我目前拥有的 URL 类似于 www.site.com?crseidcode=123456&crseprofile=123,我正在寻找一种方法来整理这个 URL(它可能包含负载参数)。传递的参数总是整数。
  • 真的,这就是查询字符串的用途。您可以按照您的建议将它们分开,但我认为您可能会冒着使想法变得不那么可读/可理解的风险,而没有什么好处。但是,如果您要传递大量参数/数据,则应考虑使用POST 请求,而不是通过查询字符串传递内容。我知道这可能是不可能的,但取决于您的情况。
  • 给定 url of server/func2/SubFunc2 // 获取路径组件。尾随分隔符。返回 {“/”、“func2/”、“sunFunc2”}。 string[] pathsegments = myUri.Segments;
【解决方案6】:

网址:server/func2/SubFunc2

// 获取路径组件。尾随分隔符。返回 {“/”、“func2/”、“sunFunc2”}。 string[] pathsegments = myUri.Segments;

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 2015-02-15
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多