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

Posted

技术标签:

【中文标题】用于替换 URL 中的页码的正则表达式【英文标题】:Regex for replace page number in URL 【发布时间】:2011-08-18 09:14:19 【问题描述】:

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

我有一个带有可选 page=123 参数的 URL。 url中也可以有其他可选的get参数,可以出现在页面参数之前或之后。

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

    从 url 中提取查询字符串。 使用HttpUtility.ParseQueryString 从查询字符串构建HttpValueCollection 替换集合中的页面参数。 在集合上调用.ToString(),你会得到一个新的查询字符串。 使用原始查询字符串减去旧查询字符串加上新查询字符串来构造更改后的 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();

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

【讨论】:

谢谢,这正是我想要的。【参考方案2】:

你希望它是一个带有正则表达式的静态方法,这是第一个状态:

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

【讨论】:

如果页码是第一个查询字符串参数就不行 你说得对,我把 "@"^http://.*(&page=(\d+)).*$" 替换为 @"^http://.*(&? page=(\d+)).*$"。我尝试快速更正,但没有那么正确,因为现在我在 URL 中有 ?。

以上是关于用于替换 URL 中的页码的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

MariaDB 中的正则表达式替换

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?

Postgres中的正则表达式查找和替换

量词可以用于R中的正则表达式替换吗?

C# 中的正则表达式大写替换