2012-05-14 40 views
9

Tôi có một hình thức mà các thuộc tính tên được cập nhật, nhưng vấn đề là im sử dụng các giá trị đa chiều như sau:Tìm và thay thế xuất hiện thứ n của [trong ngoặc vuông] biểu hiện trong chuỗi

<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... 

tôi cần phải thay đổi . giá trị trong dấu ngoặc vuông với JavaScript không có vấn đề gì vị trí họ đang có trong tôi đã thử bằng cách sử dụng biểu thức chính quy sau đây để khớp với giá trị giữa các dấu ngoặc vuông:

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

nhưng điều này phù hợp với tất cả các lần xuất hiện, và những gì tôi cần làm là bằng cách nào đó tìm và thay thế sự xuất hiện thứ n.

Hoặc nếu có cách khác để tìm và thay thế giá trị trong dấu ngoặc vuông mà không sử dụng cụm từ thông dụng, tôi là tất cả các tai.

Cảm ơn trước

Resolved

mã cuối cùng này như sau:

$('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 không hoàn toàn rõ ràng về những gì bạn đang cố gắng để làm! bằng cách sử dụng ví dụ trên bạn có thể hiển thị kết quả mong đợi ... – ManseUK

+0

Chào mừng bạn đến với StackOverflow. Tôi thấy rằng câu hỏi này không nhận được nhiều lượt xem, vì vậy tôi đã chỉnh sửa tiêu đề của bạn để phản ánh rõ ràng câu hỏi bạn đang hỏi - cách tìm và thay thế sự xuất hiện thứ n của một biểu thức trong ngoặc đơn. –

Trả lời

32

Đây là một giải pháp khả thi khác. Bạn có thể chuyển hàm string.replace một hàm để xác định giá trị thay thế sẽ là gì. Hàm sẽ được chuyển qua ba đối số. Đối số đầu tiên là văn bản phù hợp, đối số thứ hai là vị trí trong chuỗi gốc và đối số thứ ba là chuỗi gốc.

Ví dụ sau sẽ thay thế chữ "L" thứ hai trong "HELLO, WORLD" bằng "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!"; 

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

+0

Cảm ơn Daniel, điều này đã làm việc hoàn hảo. Tôi không biết rằng hàm thay thế có hàm gọi lại. –

+0

Nếu điều này trả lời câu hỏi của bạn, hãy nhấp vào dấu kiểm bên cạnh câu trả lời này để đánh dấu câu trả lời đó là câu trả lời được chấp nhận. –

+0

Chỉ cần những gì tôi cần, cảm ơn! – SpartaSixZero

0

Nếu tôi hiểu câu hỏi một cách chính xác các RegExp hiển thị dưới đây nên làm:

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]); 

Bản trình diễn tại đây: http://jsfiddle.net/EUcdX/

0

Phương pháp được đưa ra trong các câu trả lời được chấp nhận là ngắn gọn và vững chắc, nhưng nó có một nhược điểm: nếu có một chuỗi lớn với rất nhiều sự xuất hiện của chuỗi nhất định, nó sẽ được quét đến cuối - ngay cả khi người ta chỉ phải thay thế ngay từ đầu. Việc thay thế sẽ được sử dụng 'exec', sau đó phá vỡ ra khỏi dây chuyền ngay sau khi thay thế được thực hiện:

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));

Các vấn đề liên quan