2015-07-24 2 views
0

У меня есть форма с множественным ввода текста, как:JS регулярное выражение: не в состоянии вернуть массив соответствует

<div class="width-height"> 
    <input value="" name="items[1][width]" type="text"> 
    <br> 
    <input value="" name="items[1][height]" type="text"> 
</div> 
<div class="width-height"> 
    <input value="" name="items[2][width]" type="text"> 
    <br> 
    <input value="" name="items[2][height]" type="text"> 
</div> 

Я пытаюсь получить с JS Еогеасп «номер» и «ширина» или «высота» в массиве

лучший результат возможности должен быть массив с 2 значения в console.log:

1,width 
1,height 
2,width 
2,height 

стараюсь 2 регулярное выражение:

// first: /\d\]\[[a-z]+/i 
// second: /\d\]\[\w+/g 
$('.width-height > input').each(function() { 
    console.log("1 : " + $(this).attr('name').match(/\d\]\[[a-z]+/i)); 
    console.log("2 : " + $(this).attr('name').match(/\d\]\[\w+/g)); 
}); 

но результат только:

1 : 1][width 
2 : 1][width 

Я пытался использовать uncapture настройки для исключения части, что мне не нужно:

console.log("3 : " + $(this).attr('name').match(/(?:\w+\[)\d(?:\]\[)\w+/g)); 

но возвращает только 1 строку

3 : items[1][width 

Я думаю, что я не понимаю что-то в regex .. с не-захватом и флагом «g», я думаю, что он должен вернуть все возможности ily без захвата и построить массив с извлекаемым значением, но .. не ..: -/

Трансы для вашей помощи!

ответ

3

Группа, не связанная с захватом, не исключает любые данные из всего матча, она просто не будет отображаться в списке захваченных групп.

Для этого необходимо использовать группы захвата (что также означает, что вы не можете использовать match).

Группа захвата разделена ( и ).

$('.width-height > input').each(function() { 
    var regex = /(\d)\]\[(\w+)/; 
    var matches = regex.exec($(this).attr('name')); 
    console.log(matches[1] + "," + matches[2]); 
}); 
+0

хорошее объяснение, спасибо –

1

Попробуйте это прямо вперед, родной подход:

var inputs = document.querySelectorAll('div.width-height > input[name^="items"]'); 
var result = []; 
var match = null; 

Array.prototype.forEach.call(inputs,function(input){ 
    match = input.name.match(/^items\[(\d)\]\[(width|height)\]$/); 
    if(match.length===3) 
     result.push([match[1],match[2]]); 
}); 

console.log(result); 

ли вы имеете в виду массив массивов, «массив с 2 значения»? Если формат значения атрибута name не является статичным, это будет лишь незначительное изменение в регулярном выражении. Или вы хотите объяснить свое регулярное выражение?

+0

Я просто хочу, чтобы обрабатывать как значение, он может переопределить, его просто потому, что мне нужно сделать функцию, если ее «ширина», а другой с «высоты» и I необходимо, чтобы число передавалось через функцию. Это я вижу .. его просто флаг «g» .. его работы также –

+0

@ Jean-philippeEmond: Я не совсем понимаю. Вам нужно число и слово, верно?«Глобальный» флаг не имеет значения, потому что повторения в одном атрибуте нет, поэтому первого совпадения достаточно. – dakab

0

Попробуйте

$('.width-height > input').each(function() { 
    var matches = $(this).attr('name').match(/[\d]?[\w]+/gi);  
    console.log(matches.splice(1)); 
}); 
0

Если вы заинтересованы в этом, не JQuery, это вернет вам массив вашей требуемой мощности.

var inputs = document.querySelectorAll("input[type=text]"); 
var result = Array.prototype.slice.call(inputs).map(function(el){ 
    return el.getAttribute("name").replace(/.*\[(\d+)\]\[(\w+)\].*$/, "$1,$2");          
}); 
console.log(result); 

JSBIN

REGEX

Смежные вопросы