skip to Main Content

I need JavaScript special regex pattern to convert the input string to required string.
Input String:

google.com/q=abc?param1=[foo,bar]&optional=true&param2=[bar,baz]

Output String:

google.com/q=abc?param1=foo&optional=true&param2=bar

This is my code.

function transformUrl(inputUrl) {
  var pattern = /[([^,]]+),([^,]]+)]/g;
  var outputUrl = inputUrl.replace(pattern, function (match, group1) {
    return group1;
  });
  return outputUrl;
}

var inputUrl = "google.com/q=abc?aparam1=[foo,bar]&optional=true&param2=[bar,baz]";
var outputUrl = transformUrl(inputUrl);
console.log(outputUrl); // google.com/q=abc?aparam1=foo&optional=true¶m2=bar`

As you can see, main problems is solved but ‘&para’ string has been changed to ‘¶’ string.
How can I fix this issue?

Thanks in advance for your help!

2

Answers


  1. You can simplify this by looking at each parameter in turn using the URL API instead of trying to do it all at once.

    This assumes that you have a URL which includes a protocol (e.g. http: or https:). It should be trivial to prepend one of you don’t though and remove it afterwards

    // We need a complete URL including protocol
    const url = new URL('https://google.com/q=abc?param1=[foo,bar]&optional=true&param2=[bar,baz]');
    
    // iterate of each search parameter
    for (let [key, value] of url.searchParams){
    
      // does the value look like an array
      const matches = value.match(/[([^,]+)/);
      if (matches){
        // grab the first value from the array
        // and update the url
        url.searchParams.set(key, matches[1]);
      }
    }
    
    console.log(url.href);
    // outputs: https://google.com/q=abc?param1=foo&optional=true&param2=bar
    Login or Signup to reply.
  2. If you want to use regex then, use anyone of them, which is better for your:

    function transformUrl(inputUrl) {
    var pattern = /[([^,]]+),([^,]]+)]/g;
    return inputUrl.replace(pattern, (x) => x.split(',')[0].replace(/[[]]/gi, '').trim());
    }
    
    var inputUrl = "google.com/q=abc?aparam1=[foo,bar]&optional=true&param2=[bar,baz]";
    var outputUrl = transformUrl(inputUrl);
    console.log(outputUrl); // google.com/q=abc?aparam1=foo&optional=true¶m2=bar`

    or

    function transformUrl(inputUrl) {
    var pattern = /[([^,]]+),([^,]]+)]/g;
    var pattern2 = /(?<=[)[w+d+]+(?=[,]])/gi; // match first element in [foo,bar]
    return inputUrl.replace(pattern, (x) => x.match(pattern2).toString());
    }
    
    var inputUrl = "google.com/q=abc?aparam1=[foo,bar]&optional=true&param2=[bar,baz]";
    var outputUrl = transformUrl(inputUrl);
    console.log(outputUrl); // google.com/q=abc?aparam1=foo&optional=true¶m2=bar`
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search