如何解析带有"&"的查询字符串在值中使用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 &"中的"&"充电器"作为键/值对的开始?
提前感谢!凯特
如果您确实无法更正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
方法将值解码为'&'(& &)符号