【问题标题】:String function (regex?) to remove query string pair from url string字符串函数(正则表达式?)从 url 字符串中删除查询字符串对
【发布时间】:2012-02-06 06:54:23
【问题描述】:

给定以下示例“字符串”:

  • somePage.aspx?id=20&name=brian&token=1234
  • somePage.aspx?id=20&token=1234&name=brian
  • somePage.aspx?token=1234&id=20&name=brian

我想在所有情况下都删除令牌的名称/值对,所以我只剩下:

  • somePage.aspx?id=20&name=brian
  • somePage.aspx?id=20&name=brian
  • somePage.aspx?id=20&name=brian

注意:由于各种原因,我不能使用 Uri 类。

是否有一个单一的正则表达式或字符串函数可以做到这一点?

【问题讨论】:

  • I cannot use the Uri class for various reason 例如?
  • 可能在类库中添加System.Web 引用实在是太臃肿了?我遇到过。
  • 强制包含 System.Web 会导致他的应用程序对于只安装了 .Net 4.0 客户端配置文件(这是许多 W7 机器上的 .Net 的默认安装)的任何人中断,所以它使避免使用System.Web 以减少部署问题。
  • @ean5533 - Uri 不在 System.Web 中,它在 System - msdn.microsoft.com/en-us/library/system.uri.aspx
  • 我不能使用 Uri 类的原因是因为我正在处理绝对路径和各种相对路径(“../”、/SomeFolder/ 等)的组合并且能够可能无法得出真正的路径。

标签: c# asp.net regex c#-4.0 .net-4.0


【解决方案1】:

我认为这会为你做到(还没有机会测试)。

string s = "somePage.aspx?id=20&name=brian&token=1234";
s = Regex.Replace(s, @"(&token=[^&\s]+|token=[^&\s]+&?)", "");

编辑:已更新以正确处理令牌是第一对的情况。

【讨论】:

  • @JosephSilber 在令牌是第一对的情况下,它不会删除令牌之后的尾随 &,因此生成的字符串看起来像 somePage.aspx?&id=20&name=brian
  • 正确。这就是为什么你应该使用这个:token=[^&]+&?
  • 附言。使用正则表达式 static 以避免性能问题,特别是考虑到这可能会在请求中被多次调用。
  • @JosephSilber 好主意,更简洁。发布它作为答案,它比我的更好。
  • @JosephSilber 我为那个代码辛苦了好几个小时,但对于你我会允许的。
【解决方案2】:
(\btoken=[^&]*&|[\?&]token=[^&]*$)

https://regexr.com/3ia6k

此正则表达式删除所有变体中的token 参数,包括标记是唯一参数的变体:

  • somePage.aspx?token=1234

说明:

第 1 部分:\btoken=[^&]*&

...捕获token,包括它的值和一个终止的&
这部分处理以下情况:

  • somePage.aspx?id=20&token=1234&name=brian
  • somePage.aspx?token=1234&id=20&name=brian

第 2 部分:[\?&]token=[^&]*$

...捕获token,当它作为最后一个参数和/或唯一参数出现时,连同它的前导?&
这部分处理以下情况:

  • somePage.aspx?id=20&name=brian&token=1234
  • somePage.aspx?token=1234

【讨论】:

  • 它不会像“abc.com?token=123”这样的大小写
  • @yajiv:你完全正确。尽管 OP 没有要求您的案例,但它可能与此问题的许多访问者非常相关。我已经更新了我的答案以处理所有可能的组合。还加了一点解释。
【解决方案3】:

考虑使用 HttpUtility.ParseQueryString (http://msdn.microsoft.com/en-us/library/ms150046.aspx) 进行解析并使用 UriBuilder 构造回...

注意查询字符串中参数的所有编码和排序 - Uri 类会有所帮助。

【讨论】:

  • 听起来他想避免System.Web,否则他可能会使用new Uri(url)
猜你喜欢
  • 2015-12-31
  • 2021-09-07
  • 2017-08-24
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
相关资源
最近更新 更多