Trip
Trip

Reputation: 27114

Capture value out of query string with regex?

I am trying to select just what comes after name= and before the & in :

"/pages/new?name=J&return_url=/page/new"

So far I have..

^name=(.*?).

I am trying to return in this case, just the J, but its dynamic so it could very several characters, letters, or numbers.

The end case situation would be allowing myself to do a replace statement on this dynamic variable found by regex.

Upvotes: 48

Views: 115808

Answers (9)

Nilesh Yadav
Nilesh Yadav

Reputation: 29

You can get the same result with simple .split() in javascript.

let value = url.split("name=")[1].split("&")[0];

Upvotes: 0

Hisoka
Hisoka

Reputation: 1

This might work:

\??(.*=.+)*(&.*=.+)?

Upvotes: -1

HungryBeagle
HungryBeagle

Reputation: 272

Here's a single line answer that prevents having to store a variable (if you can't use URLSearchParams because you still support IE)

(document.location.search.match(/[?&]name=([^&]+)/)||[null,null])[1]

By adding in the ||[null,null] and surrounding it in parentheses, you can safely index item 1 in the array without having to check if match came back with results. Of course, you can replace the [null,null] with whatever you'd like as a default.

Upvotes: 2

vol7ron
vol7ron

Reputation: 42149

/name=([^&]*)/

  • remove the ^ and end with an &

Example:

var str     = "/pages/new?name=J&return_url=/page/new";
var matches = str.match(/name=([^&]*)/);
alert(matches[1]);

The better way is to break all the params down (Example using current address):

function getParams (str) {
   var queryString = str || window.location.search || '';
   var keyValPairs = [];
   var params      = {};
   queryString     = queryString.replace(/.*?\?/,"");

   if (queryString.length)
   {
      keyValPairs = queryString.split('&');
      for (pairNum in keyValPairs)
      {
         var key = keyValPairs[pairNum].split('=')[0];
         if (!key.length) continue;
         if (typeof params[key] === 'undefined')
         params[key] = [];
         params[key].push(keyValPairs[pairNum].split('=')[1]);
      }
   }
   return params;
}


var url    = "/pages/new?name=L&return_url=/page/new";
var params = getParams(url);
params['name'];

Update

Though still not supported in any version of IE, URLSearchParams provides a native way of retrieving values for other browsers.

Upvotes: 93

cruzanmo
cruzanmo

Reputation: 777

Improving on previous answers:

/**
 *
 * @param {string} name
 * @returns {string|null}
 */
function getQueryParam(name) {
  var q = window.location.search.match(new RegExp('[?&]' + name + '=([^&#]*)'));
  return q && q[1];
}

getQueryParam('a'); // returns '1' on page http://domain.com/page.html?a=1&b=2 

Upvotes: 12

William Neely
William Neely

Reputation: 2092

The accepted answer includes the hash part if there is a hash right after the params. As @bishoy has in his function, the correct regex would be

/name=([^&#]*)/

Upvotes: 14

Bishoy Hanna
Bishoy Hanna

Reputation: 4589

here is the full function (tested and fixed for upper/lower case)

function getParameterByName (name) 
{
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name.toLowerCase() + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.search.toLowerCase());
    if (results == null)
        return "";
    else
        return decodeURIComponent(results[1].replace(/\+/g, " "));
}

Upvotes: 5

Phil H
Phil H

Reputation: 20151

var myname = str.match(/\?name=([^&]+)&/)[1];

The [1] is because you apparently want the value of the group (the part of the regex in brackets).

var str = "/pages/new?name=reaojr&return_url=/page/new";
var matchobj = str.match(/\?name=([^&]+)&/)[1];
document.writeln(matchobj); // prints 'reaojr'

Upvotes: 4

Karl Barker
Karl Barker

Reputation: 11351

The following should work:

\?name=(.*?)&

Upvotes: 2

Related Questions