如何使用“&”解析查询字符串在使用C#的值?

时间:2011-10-03 04:45:28

标签: c# parsing query-string

我在sharepoint 2007页面上有一个C#自定义webpart。在另一个页面上单击SSRS报告中的链接时,它会将用户发送到我的自定义webpart页面,其中包含如下查询字符串:

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

注意“tax4Elem”的价值,这基本上是“码头和充电器”。 (&符号实际上可以出现在“tax4Elem”,“tax3Elem”和“tax5Elem”中。

我不能在该值中编码&符号,因此我将不得不使用它。

如何解析此查询字符串,使其无法识别“&”在“码头和充电器”中作为键/值对的开头?

提前致谢! 凯特

4 个答案:

答案 0 :(得分:1)

我认为你无法正确解析该字符串 - 它编码错误。 “码头和充电器”中的&符号应编码为%26而不是&

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

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

答案 1 :(得分:1)

显然请求不正确。但是,要解决此问题,您可以获取原始URL,然后找到{0}的IndexOf。然后,在此之前找到&ss=标志。解码(使用UrlDecode)然后重新编码(UrlEncode==之间的部分(tax4Elem的值)。然后,重建查询字符串,如下所示:

&ss=

并将其正常解码(例如,使用ParseQueryString)到correctQueryString = "?tax4Elem=" + reencodedTaxValue + remainderOfQueryString

答案 2 :(得分:1)

如果你真的无法更正网址,你仍然可以尝试解析它,但你必须做出一些决定。例如:

  • 键只能包含字母数字字符。
  • 没有空值,或者至少在密钥后面总是有一个等号=
  • 值可能包含额外的&符号和问号。
  • 值可能包含其他等号,只要它们看起来不是新键/值对的一部分(它们前面没有&\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"];

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

答案 3 :(得分:-1)

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