替换字符串中的{x}标记

我们有一个模板url,如:

http://api.example.com/sale?auth_user=xxxxx&auth_pass=xxxxx&networkid={networkid}&category=b2c&country=IT&pageid={pageid}&programid=133&saleid=1&m={master}&optinfo={optinfo}&publisher={publisher}&msisdn={userId} 

我有这些常数令牌的价值。 如何在C#中替换所有这些令牌?

一个简单的方法是使用foreach和带有String.ReplaceDictionary

 var values = new Dictionary { { "{networkid}", "WHEEE!!" } // etc. }; var url = "http://api.example.com/sale?auth_user=xxxxx&auth_pass=xxxxx&networkid={networkid}&category=b2c&country=IT&pageid={pageid}&programid=133&saleid=1&m={master}&optinfo={optinfo}&publisher={publisher}&msisdn={userId}"; foreach(var key in values.Keys){ url = url.Replace(key,values[key]); } 

.NET中没有“替换为字典值”的标准方法。 虽然有许多模板引擎,但为这样的操作编写一个小解决方案并不是很困难。 这是一个在LINQPad中运行的示例,它使用带有匹配评估器的正则表达式 。

结果是一个URL,调用者有责任确保所有提供的值都被正确编码 。 我建议在适当的时候使用Uri.EscapeDataString ..但如果在其他地方处理,请确保不要进行双重编码。

此外,在没有找到替代品时应该做什么的规则应该根据需要进行调整。 如果未找到替换应该与查询字符串键一起完全消除,以下可以将正则表达式扩展为@"\w+=({\w+})"以在此特定模板情况下捕获参数键。

 string ReplaceUsingDictionary (string src, IDictionary replacements) { return Regex.Replace(src, @"{(\w+)}", (m) => { object replacement; var key = m.Groups[1].Value; if (replacements.TryGetValue(key, out replacement)) { return Convert.ToString(replacement); } else { return m.Groups[0].Value; } }); } void Main() { var replacements = new Dictionary { { "networkid", "WHEEE!!" } // etc. }; var src = "http://api.example.com/sale?auth_user=xxxxx&auth_pass=xxxxx&networkid={networkid}&category=b2c&country=IT&pageid={pageid}&programid=133&saleid=1&m={master}&optinfo={optinfo}&publisher={publisher}&msisdn={userId}"; var res = ReplaceUsingDictionary(src, replacements); // -> "http://api.example.com/sale?..&networkid=WHEEE!!&..&pageid={pageid}&.. res.Dump(); } 

更高级的技术,如reflection和变换,是可能的 – 但那些应留给真正的模板引擎。

我猜你试图用你的值替换url参数。 这可以使用C# HttpUtility.ParseQueryString来完成

从中获取CurrentURL

  var _myUrl = System.Web.HttpUtility.ParseQueryString(Request.RawUrl); 

从查询字符串中读取参数

  string value1 = _myUrl ["networkid"]; 

将值写入QueryString对象。

  _myUrl ["networkid"] = "Your Value"; 

然后最后将其转回URL

  var _yourURIBuilder= new UriBuilder(_myUrl ); _myUrl = _yourURIBuilder.ToString(); 

您可以使用LinQ使用此alos

 Dictionary myVal = new Dictionary(); myVal.Add("networkid", "1"); myVal.Add("pageid", "2"); myVal.Add("master", "3"); myVal.Add("optinfo", "4"); myVal.Add("publisher", "5"); myVal.Add("userId", "6"); string url = @"http://api.example.com/sale?auth_user=xxxxx&auth_pass=xxxxx&networkid={networkid}&category=b2c&country=IT&pageid={pageid}&programid=133&saleid=1&m={master}&optinfo={optinfo}&publisher={publisher}&msisdn={userId}"; myVal.Select(a => url = url.Replace(string.Concat("{", a.Key, "}"), a.Value)).ToList(); 

这条线可以做你所需要的function

myVal.Select(a => url = url.Replace(string.Concat(“{”,a.Key,“}”),a.Value))。ToList();

有一个名为StringTokenFormatter的Nuget做得很好https://www.nuget.org/packages/StringTokenFormatter/