如何从HttpUtility.ParseQueryString中提取特定情况的字段?

时间:2019-01-28 14:04:33

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

.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”部分?希望不必重写解析器或对字符串进行预处理。

2 个答案:

答案 0 :(得分:0)

  

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

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

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参数,此操作可能会失败,因此您可能必须编辑正则表达式以满足您的需求。

答案 1 :(得分:0)

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

让我知道这是否有帮助。