用于替换 URL 中的页码的正则表达式

本文关键字:正则表达式 替换 URL 用于 | 更新日期: 2023-09-27 17:55:08

我不擅长正则表达式,也无法找出适用的解决方案,因此经过大量搜索后,我仍然无法确定这一点。

我有一个带有可选页面 = 123 参数的 URL。url 中也可以有其他可选的 get 参数,这些参数可能发生在页面参数之前或之后。

我需要将该参数替换为page=--PLACEHOLDER-以便能够将其与我的分页函数一起使用。

如果 url 中没有出现 page 参数,我想按照前面描述的方式添加它。

我正在尝试为此为 on string 编写一个扩展方法,但静态函数也一样好。

一些解释也将不胜感激,因为它会给我上一堂很好的正则表达式课,希望下次我不必问。

我也在使用 asp.net mvc-3,但出于兼容性原因,在 mvc-s 路由之前发生了复杂的重写,我无法访问它。所以请不要建议我为此使用 mvc-s 路由,因为我不能。

用于替换 URL 中的页码的正则表达式

我建议跳过正则表达式并使用另一种方法:

  1. 从 url 中提取查询字符串。
  2. 使用 HttpUtility.ParseQueryString 从查询字符串生成HttpValueCollection
  3. 替换集合中的页面参数。
  4. 调用集合上的.ToString(),你会得到一个新的查询字符串。
  5. 使用原始 url 减去旧查询字符串加上新查询字符串来构造更改后的 URL。

像这样:

public static string SetPageParameter(this string url, int pageNumber)
{
    var queryStartIndex = url.IndexOf("?") + 1;
    if (queryStartIndex == 0)
    {
        return string.Format("{0}?page={1}", url, pageNumber);
    }
    var oldQueryString = url.Substring(queryStartIndex);
    var queryParameters = HttpUtility.ParseQueryString(oldQueryString);
    queryParameters["page"] = pageNumber;
    return url.Substring(0, queryStartIndex) + queryParameters.ToString();
}

我还没有验证这是否编译,但它应该给你一个想法。

您希望它作为具有正则表达式的静态方法,这是第一个状态:

public static string ChangePage(string sUrl)
{
  string sRc = string.Empty;
  const string sToReplace = "&page=--PLACEHOLDER--";
  Regex regURL = new Regex(@"^http://.*(&?page=('d+)).*$");
  Match mPage =  regURL.Match(sUrl);
  if (mPage.Success) {
    GroupCollection gc = mPage.Groups;
    string sCapture = gc[1].Captures[0].Value;
    // gc[2].Captures[0].Value) is the page number
    sRc = sUrl.Replace(sCapture, sToReplace);
  }
  else {
    sRc = sUrl+sToReplace;
  }
  return sRc;
}

用一个小测试:

static void Main(string[] args)
{
  string sUrl1 = "http://localhost:22666/HtmlEdit.aspx?mid=0&page=123&test=12";
  string sUrl2 = "http://localhost:22666/HtmlEdit.aspx?mid=0&page=125612";
  string sUrl3 = "http://localhost:22666/HtmlEdit.aspx?mid=0&pager=12";
  string sUrl4 = "http://localhost:22666/HtmlEdit.aspx?page=12&mid=0";
  string sRc = string.Empty;
  sRc = ChangePage(sUrl1);
  Console.WriteLine(sRc);
  sRc = ChangePage(sUrl2);
  Console.WriteLine(sRc);
  sRc = ChangePage(sUrl3);
  Console.WriteLine(sRc);
  sRc = ChangePage(sUrl4);
  Console.WriteLine(sRc);
}

给出的结果是:

http://localhost:22666/HtmlEdit.aspx?mid=0&page=--PLACEHOLDER--&test=12
http://localhost:22666/HtmlEdit.aspx?mid=0&page=--PLACEHOLDER--
http://localhost:22666/HtmlEdit.aspx?mid=0&pager=12&page=--PLACEHOLDER--
http://localhost:22666/HtmlEdit.aspx?&page=--PLACEHOLDER--&mid=0