【问题标题】:How to extract specific-case fields from HttpUtility.ParseQueryString?如何从 HttpUtility.ParseQueryString 中提取特定案例字段?
【发布时间】:2019-06-21 13:17:54
【问题描述】:

.net 标准库函数 System.Web.HttpUtility.ParseQueryString 将查询字符串解析为名称/值对。

var a = HttpUtility.ParseQueryString("abc=123&def=456");
var x = a["abc"]; /* "123" */

当有两个名称相同但大小写不同的字段时,返回的对象将两个值用逗号组合在一起。

var a = HttpUtility.ParseQueryString("abc=123&ABC=456");
var x = a["abc"]; /* "123,456" */

我怎样才能自己拉出“abc”部分?希望无需重写解析器或预处理字符串。

【问题讨论】:

标签: c# .net parsing url-encoding standard-library


【解决方案1】:

使用 parseQuerystring 不可能有两个具有相同名称但大小写不同的键,因为它的返回类型是 NameValueCollection,其默认行为是提供唯一键的集合,如果您尝试在此集合中添加相同的键,默认情况下会添加以逗号分隔,与现有键值分隔。

如果这有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    希望不重写解析器或预处理字符串。

    我不认为这是可能的,但这里有一个稍微简洁的实现应该可以解决问题:

    string pattern = @"(?<=^|&)(\w+)(?==)=(\w+)(?=&?)";
    string input = @"abc=123&ABC=456&abc=789";
    
    Dictionary<string, string> parameters = new Dictionary<string, string>();
    
    foreach (Match m in Regex.Matches(input, pattern))
    {
        if (parameters.ContainsKey(m.Groups[1].Value))
        {
            //preserve original behaviour, i.e. concat values of same parameters
            parameters[m.Groups[1].Value] = parameters[m.Groups[1].Value] + "," + m.Groups[2].Value;
        } else
        {
            parameters.Add(m.Groups[1].Value, m.Groups[2].Value);
        }
    }
    

    a-zA-Z0-9_ 之外的 Unicode 参数可能会失败,因此您可能需要编辑正则表达式以满足您的需要。

    【讨论】:

      猜你喜欢
      • 2013-04-11
      • 2011-07-03
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多