17

名前属性が更新されるフォームがありますが、問題は次のように多次元値を使用していることです。

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

角かっこ内の値は、JavaScriptでどの位置にあるかに関係なく変更する必要があります。次の正規表現を使用して、角かっこ内の値を一致させようとしました。

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

しかし、これはすべての出現に一致し、私がする必要があるのは、何らかの形で n 番目の出現を見つけて置き換えることです。

または、正規表現を使用せずに角括弧内の値を見つけて置き換える別の方法がある場合、私はすべて耳にします。

前もって感謝します

解決済み

この最終的なコードは次のとおりです。

$('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;
    }));
});
4

4 に答える 4

45

ここに別の可能な解決策があります。string.replace 関数に関数を渡して、置換値を決定することができます。関数には 3 つの引数が渡されます。最初の引数は一致するテキスト、2 番目の引数は元の文字列内の位置、3 番目の引数は元の文字列です。

次の例は、「HELLO, WORLD」の 2 番目の「L」を「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!";

MDN を参照してください: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace

于 2012-05-14T14:23:11.850 に答える
2

受け入れられた回答で与えられたアプローチは簡潔でしっかりしていますが、欠点があります。指定された部分文字列が多数出現する大きな文字列がある場合、最後までスキャンされます。始まり。別の方法としては、'exec' を使用し、置換が完了した直後にチェーンを切断します。

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

于 2017-10-17T12:58:50.027 に答える
0

私が質問を正しく理解していれば、以下に示す正規表現は次のようになります。

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

デモはこちら: http://jsfiddle.net/EUcdX/

于 2012-05-14T14:11:12.700 に答える