【问题标题】:Replace {x} tokens in strings替换字符串中的 {x} 标记
【发布时间】:2013-12-15 05:23:53
【问题描述】:

我们有一个模板网址,例如:

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# 中替换所有这些标记?

【问题讨论】:

  • 在 msdn 上查找 string.Replace
  • 这个网址是你想存储在某个地方并发送它还是你的请求中出现???
  • Named string formatting in C# 的可能重复项
  • 关于示例 URL 的旁注:当使用 http 而不是 https 作为 url 时,url 会以未加密的方式发送。因此,如果有人在嗅探您的流量,他可以在 url 中看到用户名和密码(并且可能会在途中登录服务器日志)。

标签: c# asp.net token


【解决方案1】:

有一个名为 StringTokenFormatter 的 Nuget 可以很好地做到这一点 https://www.nuget.org/packages/StringTokenFormatter/

【讨论】:

  • 这个任务的优秀包。
  • 它内置了URI处理器,你知道这是否会自动处理url编码吗?
【解决方案2】:

一种简单的方法是使用foreachDictionaryString.Replace

var values = new Dictionary<string, string> {
    { "{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]);
}

【讨论】:

  • 借用我的重置价值的好方法;-)嗯,这很容易理解,所以+1。
【解决方案3】:

.NET 中没有“用字典值替换”的标准方法。虽然有很多 个模板引擎,但为这样的操作编写一个小的解决方案并不难。这是一个在LINQPad 中运行并使用Regular Expression with a Match Evaluator 的示例。

由于结果是一个 URL, 调用者有责任确保所有提供的值都是correctly encoded。我建议酌情使用Uri.EscapeDataString .. 但如果在其他地方处理,请确保不要双重编码。

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

string ReplaceUsingDictionary (string src, IDictionary<string, object> 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<string, object> {
        { "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();
}

更高级的技术,如反射和转换,是可能的 - 但这些应该留给真正的模板引擎。

【讨论】:

    【解决方案4】:

    你可以通过 LinQ 使用这个 alos

    Dictionary<string, string> myVal = new Dictionary<string, string>();
    
    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();
    

    这条线可以做你需要的功能

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

    【讨论】:

      【解决方案5】:

      我猜您正在尝试用您的值替换 url 中的参数。这可以使用 C# HttpUtility.ParseQueryString

      来完成

      获取当前URL
         var _myUrl = System.Web.HttpUtility.ParseQueryString(Request.RawUrl);
      

      从查询字符串中读取参数

         string value1 = _myUrl ["networkid"];
      

      将值写入 QueryString 对象。

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

      最后再转回网址

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

      【讨论】:

      • 这个处理url编码吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2016-02-04
      • 1970-01-01
      • 2014-06-03
      • 2020-07-22
      • 1970-01-01
      相关资源
      最近更新 更多