2012-05-14 8 views
9

Mam formularza gdzie atrybuty nazwa aktualizowane, ale problem jest im przy wartości wielowymiarowych następująco:Znajdź i zastąp n-tego wystąpienia [nawiasach] wypowiedzi w struny

<input type="text" name="questions[0][question]" /> 
<input type="text" name="questions[0][order]" /> 
<input type="text" name="questions[0][active]" /> 
<input type="text" name="answers[0][1][answer]" /> 
<input type="text" name="answers[0][2][answer]" /> 
<input type="text" name="answers[0][3][answer]" /> 

<input type="text" name="questions[1][question]" /> 
<input type="text" name="questions[1][order]" /> 
<input type="text" name="questions[1][active]" /> 
etc... 

muszę zmienić . wartość wewnątrz nawiasów kwadratowych JavaScript nie materii jakie stanowisko one w próbowałem za pomocą następującego wyrażenia regularnego, aby dopasować wartość w nawiasach kwadratowych:

/(?<=\[)[^\]]*(?=\])/g 

ale to pasuje do wszystkich wystąpień, a to, co muszę zrobić, to znaleźć i zastąpić n-tego wystąpienia.

Lub jeśli istnieje inny sposób na znalezienie i zamianę wartości w nawiasach kwadratowych bez użycia wyrażeń regularnych, to jestem uszy.

góry dzięki

Rozwiązane

Ten ostatni kod jest w następujący sposób:

$('input', this).each(function(){ 
    var name = $(this).attr('name'); 
    var i = 0; 
    $(this).attr('name', name.replace(/\[.+?\]/g,function (match, pos, original) { 
    i++; 
    return (i == 1) ? "[THE REPLACED VALUE]" : match; 
    })); 
}); 
+0

Im nie do końca jasne, co próbujesz zrobić! używając powyższego przykładu możesz pokazać oczekiwane wyjście ... – ManseUK

+0

Witamy w StackOverflow. Widzę, że to pytanie nie ma zbyt wielu poglądów, więc zredagowałem twój tytuł, aby wyraźnie odzwierciedlał pytanie, które zadajesz - jak znaleźć i zamienić n-te wystąpienie wyrażenia w nawiasach. –

Odpowiedz

32

Oto kolejne możliwe rozwiązanie. Funkcję string.replace można przekazać funkcji określającej wartość zastępczą. Funkcja zostanie przekazana trzy argumenty. Pierwszym argumentem jest pasujący tekst, drugim argumentem jest pozycja w oryginalnym łańcuchu, a trzeci argument to oryginalny ciąg.

Następujący przykład zastąpi drugi "L" w "HELLO, WORLD" z "M".

var s = "HELLO, WORLD!"; 
var nth = 0; 
s = s.replace(/L/g, function (match, i, original) { 
    nth++; 
    return (nth === 2) ? "M" : match; 
}); 
alert(s); // "HELMO, WORLD!"; 

See MDN: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace

+0

Dzięki Daniel, wszystko działało idealnie. Nie wiedziałem, że funkcja wymiany ma funkcję zwrotną. –

+0

Jeśli to odpowiedział na twoje pytanie, kliknij znacznik obok tej odpowiedzi, aby oznaczyć go jako zaakceptowaną odpowiedź. –

+0

Właśnie tego potrzebowałem, dzięki! – SpartaSixZero

0

Jeśli rozumiem pytanie poprawnie RegExp poniżej należy zrobić:

var patt = /<input.*?(\[(\d)\])(\[(\d)\]){0,1}.*/g 
var res = patt.exec(' <input type="text" name="questions[0][1][question]" />'); 

alert('First number: ' + res[2] + "\nSecond number: " + res[4]); 

Demo tutaj: http://jsfiddle.net/EUcdX/

0

Podejście podane w przyjętym odpowiedź jest zwięzła i solidne, ale ma wadę: jeśli istnieje duża łańcuch z wieloma postaciami danego fragmentu, to będzie być skanowane do końca - nawet jeśli trzeba je wymienić tylko na początku. Alternatywą byłoby używając „exec”, następnie zerwania łańcucha tuż po wymiana odbywa się:

function replaceNthOccurence(source, pattern, replacement, n) { 
 
    var substr = ''; 
 
    while (substr = pattern.exec(source)) { 
 
    if (--n === 0) { 
 
     source = source.slice(0, substr.index) + replacement + source.slice(pattern.lastIndex); 
 
     break; 
 
    } 
 
    } 
 
    return source; 
 
} 
 

 
console.log(replaceNthOccurence('bla_111_bla_222_bla_333', /\d+/g, '1st', 1)); 
 
console.log(replaceNthOccurence('bla_111_bla_222_bla_333', /\d+/g, '2nd', 2)); 
 
console.log(replaceNthOccurence('bla_111_bla_222_bla_333', /\d+/g, '3rd', 3));