【问题标题】:Replace query parameter with another value/token用另一个值/标记替换查询参数
【发布时间】:2018-06-21 14:37:47
【问题描述】:

我正在尝试用查询 wID=[[WID]] 替换 URL 查询模式 wID=xxx,其中 xxx 可以是数字、数字或空格(请注意,查询区分大小写)。我想知道我怎样才能做到这一点。目前,我正在使用正则表达式在 URL 中查找模式并使用 Regex.Replace() 替换它,如下所示:

private const string Pattern = @"wID=^[0-9A-Za-z ]+$";
private const string Replace = @"wID=[[WID]]";
/// <summary>
/// Extension method to evaluate the url token for wid
/// </summary>
/// <param name="rawUrl">Incoming URL</param>
/// <returns>Expected URL</returns>
public string GetUrl(string rawUrl)
{
    if (string.IsNullOrWhiteSpace(rawUrl))
    {
        return string.Empty;
    }

    string result = Regex.Replace(rawUrl, Pattern, Replace);
    return result;
}

但这并没有给我想要的输出,因为正则表达式模式不正确,我想。有更好的方法吗?
我的问题与实现正则表达式模式以查找和替换 URL 查询参数值有关,我发现 URI 构建器在这些情况下更有帮助并且可以使用,所以这是不同的问题。

【问题讨论】:

标签: c# regex url


【解决方案1】:

有更好的方法来做到这一点。 看看使用NameValueCollection 解析查询字符串:

 var queryStringCollection = HttpUtility.ParseQueryString(Request.QueryString.ToString());
 queryStringCollection.Remove("wID");
 string newQuery = $"{queryStringCollection.ToString()}&wID=[[WID]]";

【讨论】:

  • ParseQueryString 实际上使用了一个专门的 Http 集合,当你 .Set 时会转义 [ 和 ]。
  • 好点@AlexK。我什至没有注意到这一点。我已经更新了答案
【解决方案2】:

正如@maccettura 所说,您可以使用内置的。这里我们将使用HttpUtility.ParseQueryString 解析参数然后设置值,最后替换查询。

Try it online!

public static void Main()
{
    Console.WriteLine(GetUrl("http://example.org?wID=xxx"));
}

/// <summary>
/// Extension method to evaluate the url token for wid
/// </summary>
/// <param name="rawUrl">Incoming URL</param>
/// <returns>Expected URL</returns>
public static string GetUrl(string rawUrl)
{
    if (string.IsNullOrWhiteSpace(rawUrl))
    {
        return string.Empty;
    }
    var uriBuilder = new UriBuilder(rawUrl);
    var queryString = HttpUtility.ParseQueryString(uriBuilder.Query);
    queryString.Set("wID", "[[WID]]");
    uriBuilder.Query = queryString.ToString();
    return uriBuilder.Uri.ToString();
}

输出

http://example.org/?wID=[[WID]]

【讨论】:

  • 如果您有另一个类似于“wID”的查询参数名称(例如“qwID”)怎么办?
  • 可能比.Remove("wID") 更好,然后手动添加wID=[[WID]]&amp;,不幸的是你不能直接分配[[WID]],因为它会被转义。
【解决方案3】:

您不需要正则表达式。

var index = rawUrl.IndexOf("wID=");
if (index > -1)
{
   rawUrl = rawUrl.Substring(0, index + 4) + "[[WID]]";
}

【讨论】:

  • 这似乎不对。为什么你的子字符串从rawUrl 的开头开始?为什么它被硬编码为 4 长度?
【解决方案4】:

我会抛出我自己的答案,因为它的可重用性更高,而且它确实不会转义括号 ([]):

public static string ModifyUrlParameters(string rawUrl, string key, string val)
{
    if (string.IsNullOrWhiteSpace(rawUrl))
    {
        return string.Empty;
    }

    //Builds a URI from your string
    var uriBuilder = new UriBuilder(rawUrl);        

    //Gets the query string as a NameValueCollection
    var queryItems = HttpUtility.ParseQueryString(uriBuilder.Uri.Query);

    //Sets the key with the new val
    queryItems.Set(key, val);

    //Sets the query to the new updated query
    uriBuilder.Query = queryItems.ToString();

    //returns the uri as a string
    return uriBuilder.Uri.ToString();
}

输入:http://example.org?wID=xxx

结果:http://example.org/?wID=[[WID]]

小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多