如何解析带有"&"的查询字符串在值中使用c#

本文关键字:quot 何解析 查询 字符串 | 更新日期: 2023-09-27 18:10:21

我在sharepoint 2007页面上有一个c#自定义webpart。当点击另一个页面上的SSRS报告中的链接时,它将用户发送到我的自定义webpart页面,并提供如下查询字符串:

?tax4Elem=Docks%20&%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger

请注意"tax4Elem"的值,它基本上是"Docks &充电器"。(与符号实际上可以在"tax4Elem"、"tax3Elem"answers"tax5Elem"中出现)。

我不能对该值中的&符号进行编码,所以我必须处理这个

我如何解析这个查询字符串,使它不识别"Docks &"中的"&"充电器"作为键/值对的开始?

提前感谢!凯特

如何解析带有"&"的查询字符串在值中使用c#

如果您确实无法更正URL,您仍然可以尝试解析它,但是您必须做出一些决定。例如:

  • 按键只能包含字母数字字符。
  • 没有空值,或者至少在
  • 键后面总是有一个等号=
  • 值可以包含额外的&和问号。
  • 值可以包含额外的等号,只要它们不是新键/值对的一部分(它们前面没有&'w+)

捕获这些对的一种可能方法是:

MatchCollection matches = Regex.Matches(s, @"'G[?&](?<Key>'w+)=(?<Value>.*?(?=$|&'w+=))");
var values = matches.Cast<Match>()
                    .ToDictionary(m => m.Groups["Key"].Value,
                                  m => HttpUtility.UrlDecode(m.Groups["Value"].Value),
                                  StringComparer.OrdinalIgnoreCase);

你可以得到这些值:

string tax4 = values["tax4Elem"];

请注意,如果查询字符串根据我们的规则是"无效的",那么模式可能无法捕获所有值。

我认为您无法正确解析该字符串-它已被错误编码。"Docks &"中的&号充电器"应该被编码为%26而不是&:

?tax4Elem=Docks%20%26%20Chargers&ss=EU%20MOVEX&Phase=1&tax3Elem=Play%20IT&tax5Elem=Charger

是否可以更改生成URL的代码?

显然请求是不正确的。但是,为了解决这个问题,您可以获取原始URL,然后找到&ss=的IndexOf。然后,在此之前找到=符号。解码(用UrlDecode)然后重新编码(用UrlEncode) =&ss=之间的部分(tax4Elem的值)。然后,像这样重构查询字符串:

correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString

并正常解码(例如使用ParseQueryString)为NameValueCollection

或者您可以使用HttpServerUtility.HtmlDecode方法将值解码为'&'(& &)符号