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

时间:2013-11-29 04:49:22

标签: c# asp.net token

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

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

5 个答案:

答案 0 :(得分:10)

一种简单的方法是使用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 :(得分:7)

在.NET中没有标准的“替换字典值”的方法。虽然模板引擎有 number ,但为这样的操作编写一个小解决方案并不是很难。以下示例在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();
}

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

答案 2 :(得分:5)

我猜您正在尝试将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();

答案 3 :(得分:2)

您可以使用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 =&gt; url = url.Replace(string.Concat(“{”,a.Key,“}”),a.Value))。ToList();

答案 4 :(得分:1)

有一个名为StringTokenFormatter的Nuget可以很好地完成这项工作 https://www.nuget.org/packages/StringTokenFormatter/