Сначала примеры, потом вопросы...
Пример 1) Неглобальное совпадение '?sort=alpha&direction=asc'
'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/);
Выход:
// ['sort=alpha', 'sort', '=alpha', 'alpha']
Пример 2) Глобальное совпадение '?sort=alpha&direction=asc'
'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/g);
Выход:
// ['sort=alpha', 'sort', '=alpha', 'alpha']
Пример 3) Замена глобального соответствия '?sort=alpha&direction=asc'
getRequestParameters: function () {
var query_string = {},
regex = new RegExp('([^?=&]+)(=([^&]*))?', 'g');
'?sort=alpha&direction=asc'.replace(regex, function(match, p1, p2, p3, offset, string) {
console.log(match, p1, p2, p3, offset, string);
query_string[p1] = p3;
});
}
Выход:
// sort=alpha sort =alpha alpha 1 ?sort=alpha&direction=asc
// direction=asc direction =asc asc 12 ?sort=alpha&direction=asc
Мои вопросы
Я не уверен, что смог бы когда-нибудь додуматься до этого самостоятельно, но я никогда не «живу» с решением, и я должен понять рифму, стоящую за причиной. Конкретные совпадения я думаю понимаю "достаточно полностью". Я считаю, что знаю некоторые ответы ниже, но я предпочитаю не делать предположений и учиться у более умных людей!
- Почему 1) и 2) одинаковы? (или они?)
- Что означает sort=alpha в 1) и 2)?
- Почему 2) не возвращает параметры сортировки и направления?
- Что такое 3) перебор с .replace()?
- Есть ли способ захвата N параметров без .replace()?
Спасибо!
обновить
var regex = new RegExp('([^?&=]+)(=([^&]*))?');
regex.exec('?sort=alpha&direction=asc');
// Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]
var regex = new RegExp('([^?&=]+)(=([^&]*))?', 'g');
regex.exec('?sort=alpha&direction=asc');
// Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]
'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/);
// Chrome 21 - ["sort=alpha", "sort", "=alpha", "alpha"]
'?sort=alpha&direction=asc'.match(/([^?&=]+)(=([^&]*))?/g);
// Chrome 21 - ["sort=alpha", "direction=asc"]
var regex = new RegExp('([^?&=]+)(=([^&]*))?', 'g');
regex.lastIndex = 11;
regex.exec('?sort=alpha&direction=asc');
// Chrome 21 - ["direction=asc", "direction", "=asc", "asc"]
Таким образом, пример 3) по-прежнему верен, но перейдите к этот ответ для более квалифицированного ответа.
завершить обновление
Ссылки и благодарность Стивену Беннеру:
- https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/match
- https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace
- http://stevenbenner.com/2010/03/javascript-regex-trick-parse-a-query-string-into-an-object/
- http://www.bloggingdeveloper.com/post/JavaScript-QueryString-ParseGet-QueryString-with-Client-Side-JavaScript.aspx (похожая тема, поэтому я добавил ее)