Question

I'm not good with regex and I'm not able to figure out an applicable solution, so after a good amount of searching I'm still unable to nail this.

I have an URL with an optional page=123 parameter. There can be other optional get parameters in the url too which can occur before or after the page parameter.

I need to replace that parameter to page=--PLACEHOLDER-- to be able to use it with my paging function.

If the page parameter does not occur in the url, I would like to add it the way described before.

I'm trying to write an extension method for on string for this, but a static function would be just as good.

A bit of explanation would be appreciated too, as it would give me a good lesson in regex and hopefully next time I wouldn't have to ask.

Also I'm using asp.net mvc-3 but for compatibility reasons a complex rewrite occurs before the mvc-s routing, and I'm not able to access that. So please don't advise me to use mvc-s routing for this because I cant.

Was it helpful?

Solution

I suggest skipping the regex and using another approach:

  1. Extract the querystring from the url.
  2. Build a HttpValueCollection from the querystring using HttpUtility.ParseQueryString
  3. Replace the page parameter in the collection.
  4. Call .ToString() on the collection and you get a new querystring back.
  5. Construct the altered url using the original minus the old querystring plus the new one.

Something like:

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

I haven't verified that this compiles, but it should give you an idea.

OTHER TIPS

You want it as a static method with regular expression, here is a first state :

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

With a small test :

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

which give the result :

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top