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

时间:2011-05-04 09:24:06

标签: c# asp.net regex url-parameters

我对正则表达式并不擅长,而且我无法找到适用的解决方案,所以在经过大量搜索之后,我仍然无法确定这一点。

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

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

如果页面参数未在网址中出现,我想按照之前描述的方式添加。

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

一些解释也会受到赞赏,因为它会给我一个很好的正则表达式的教训,并希望下次我不必问。

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

2 个答案:

答案 0 :(得分:5)

我建议跳过正则表达式并使用其他方法:

  1. 从网址中提取查询字符串。
  2. 使用HttpUtility.ParseQueryString
  3. 从查询字符串构建HttpValueCollection
  4. 替换集合中的page参数。
  5. 在集合上调用.ToString(),然后返回新的查询字符串。
  6. 使用原始减去旧查询字符串加上新查询字符串构建更改后的网址。
  7. 类似的东西:

    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();
    }
    

    我还没有确认这个编译,但它应该给你一个想法。

答案 1 :(得分:0)

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

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