2015-07-07 2 views
1

Учитывая следующие два примера:Regex QueryString-как строка

'123?type=hand' ===> 'type'

'123?type=hand&status=alive' ===> 'статус типа'

В английском я хочу: найти ? и удалить все впереди. Найти = и удалить все после него до &.

В конце дня то, что я хочу, это просто строка, массив, независимо от фактического имени запросаStringVariableNames. Ни одно из значений.

Я думаю, что я над его комплексообразованием. :)

Вот несколько отрывков я работал с:

var pattern = /\*(\?)|\*(\&)|(\=)\*/ig; 
var pattern = /(.+?\?)/g; 

str.replace(pattern, function (matcher, positionOfMatch, item) { 
      return ''; 
}); 

Я начал использовать в replace полной формы, чтобы я мог лучше видеть, что происходит.

EDIT

Моя Конкретная реализация в конечном итоге быть следующее:

function (str) { 
    str = str.substr(str.indexOf('?') + 1); 

    return str.split('&') 
      .map(function (i) { 
       return i.substr(0, i.indexOf('=')) 
      }); 
} 

ответ

3

Было бы проще просто использовать строковые операции вместо обычные выражения. Это дает вам массив с ключами в строке:

var str = '123?type=hand&status=alive'; 
 

 
str = str.substr(str.indexOf('?') + 1); 
 
var keys = str.split('&'); 
 
for (var i = 0; i < keys.length; i++) { 
 
    keys[i] = keys[i].substr(0, keys[i].indexOf('=')); 
 
} 
 

 
// Show in StackOverflow snippet 
 
document.write(JSON.stringify(keys));

1

Я хотел бы сделать это следующим образом:

var result = str.split("?")[1].split("&"); 

Так что, если ваша строка 123?foo=bar&one=something&nothing=else, вы «Получение массива строк как result: foo=bar, one=something, nothing=else.

Тогда первый параметр доступен по result[0], его ключ доступен с result[0].split("=")[0], и его значение доступно с помощью result[0].split("=")[1].

1

Вы можете использовать этот массив и захватить в плен группу # 1:

/[?&]([^=]+)/g 

RegEx Demo

Код:

var str = '123?type=hand&status=alive'; 
var re = /[?&]([^=]+)/g; 
var m; 
var result = []; 

while ((m = re.exec(str)) !== null) { 
    if (m.index === re.lastIndex) 
     re.lastIndex++; 
    result.push(m[1]); 
} 

console.log(result); 
//=> ["type", "status"]