- 締切済み
javascriptの文字列置換
例えば aaという入力文字列に対し、結果として <span id=1>a</span><span id=2>a</span> というように、ここの「a」に関してidによる区別を行いつつ、置換を行いたいです。 現在、下記のコードのように書いていて、 indexSet=[a, 0, b, 1, c, 2] という配列になっています。 var num = 0; for (var i = 0; i < indexSet.length; i+=2) { var subjectKeyword = new RegExp( indexSet[i], "g" ); if( Body.match(subjectKeyword) ){ Body = Body.split( indexSet[i] ).join( '<span id=' + indexSet[i+1] + '-' + num + '>' + indexSet[i] + '</span>' ); num++; } else { Body = Body; } } 欲しい結果は <span id=1-1>a</span><span id=1-2>a</span> なのですが、上記のコードでは <span id=1-1>a</span><span id=1-1>a</span> と、全てのaに対して同時処理を行っているように見えます。 どのように改善すればよいのかわかりません。どうか力を貸していただけませんか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Ogre7077
- ベストアンサー率65% (170/258)
No.3 は根本的な間違いがありましたので修正します。 関数 replace は一回のみ適用でなければ、置換結果を再び置換してしまう可能性があったので。 var 入力 = "ABC of APC"; var 条件 = [ ['a', 0], ['b', 1], ['c', 2] ]; var LC = function(s){return s.toLowerCase()}; var RP = function(s){var i=1,a=arguments;return s.replace(/%/g,function(){return a[i++]})}; var cx = 条件.reduce(function(o,c){o[LC(c[0])]=[c[1],0]; return o}, {}); var re = new RegExp(条件.map(function(c){return c[0]}).join('|'), 'gi'); var 結果 = 入力.replace(re, function(str,ofs,src){ var c = cx[LC(str)]; return c? RP('<span id="no%-%">%</span>',c[0],c[1]++,str): str; });
- Ogre7077
- ベストアンサー率65% (170/258)
ご要望の結果を得るならば、置換箇所毎に個別処理が必要がありますが、 <script> 文字列.split(re).join(置換文) </script> では不可能です <script> 文字列.replace(re,function(s){return 置換文}) </script> にて処理しましょう 以下サンプルです <script>(function(){_=0; _ ; var body = "ABC of APC"; _ ; var iset = [ ['a', 0], ['b', 1], ['c', 2]]; _ ; var answ = iset.reduce(function(prev, curr){ _ , _ ; var re = new RegExp(curr[0], 'ig'); _ , _ ; var a = curr[1], b = 0; _ , _ ; return prev.replace(re, function(str,ofs,src){ _ , _ , _ ; var id = 'no' + a + '-' + (b++); _ , _ , _ ; return '<span id="%">%</span>'.replace(/%/,id).replace(/%/,str); _ , _ ; }); _ ; }, body); _ ; alert(answ); })()</script>
- yambejp
- ベストアンサー率51% (3827/7415)
>これはあくまで例です。 とにかく例が悪すぎ 特定のテキストノードの値をspanで囲みたいのでしょうか? その際のidの付け方のルールも曖昧でわかりづらい
- yambejp
- ベストアンサー率51% (3827/7415)
htmlにおいては、idに数値だけを指定することはありえないので このプログラムの実用性もほぼないと思います
補足
これはあくまで例です。