[英]Search and replace and remember with which word the string has been replaced in regex
[英]How to not replace the word that has already been replaced
这是我的代码:
<script>
function TransposeDown() {
$("body").html($("body").html().replace(/C/g, 'B'));
$("body").html($("body").html().replace(/B/g, 'Bb'));
}
</script>
<button onclick="TransposeDown();">Transpose Down</button>
<span class="hcrd">C</span>
<span class="hcrd">B</span>
<span class="hcrd">C</span>
问题是,一旦button
被点击时,所有的内文<span>
标签更改为“BB”。 但是我想要的是第一个和最后一个span
的文本更改为“ B”,而第二个的文本仅更改为“ Bb”。
我该怎么做呢? 有没有办法只执行一次功能呢? 任何帮助表示赞赏。
您可以反转(在简单实例中可以使用),也可以像这样进行甚至在复杂实例中也可以使用:
var string = "A B C D";
string = string.replace(/(C)|(B)/g,function(str,p1,p2) {
if(p1) return 'B';
if(p2) return 'Bb';
});
因此,在您的情况下,它将是:
$("body").html($("body").html().replace(/(C)|(B)/g,function(str,p1,p2) {
if(p1) return 'B';
if(p2) return 'Bb';
}));
由于您显然是在尝试移调和弦,因此我将寻求一种使用data-original
的解决方案来存储原始音符,并跟踪用户移调音符的次数。 这样,您可以轻松地重置整个事情。
工作示例: https : //jsfiddle.net/dannyjolie/b5ghxLoL/1/
更新:开箱即用,不适用于第6,第7,maj,min等,但是也可以将其存储为data属性,并附加到输出中。
var notes = ["A", "Bb", "B", "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab"]; var transposed = 0; function transpose() { var chords = document.querySelectorAll('.hcrd'); var chord = ''; for (var i = 0; i < chords.length; i++) { chord = chords[i].dataset['original']; chords[i].innerHTML = getNewChord(chord); } } function getNewChord(chord) { var origIndex = notes.indexOf(chord); if (origIndex === -1) { // Invalid chord return chord; } if (origIndex + transposed < 0) { return notes[notes.length + transposed + origIndex]; } return notes[origIndex + transposed]; } function transposeDown() { transposed -= 1; if(transposed === -12){ transposed = 0; } transpose(); } function reset() { transposed = 0; transpose(); } document.querySelector('#transposedown').addEventListener('click', transposeDown, false); document.querySelector('#reset').addEventListener('click', reset, false)
<span class="hcrd" data-original="C">C</span> <span class="hcrd" data-original="B">B</span> <span class="hcrd" data-original="C">C</span> <span class="hcrd" data-original="G">G</span> <span class="hcrd" data-original="E">E</span> <button id="transposedown">Transpose down</button> <button id="reset">Reset</button>
简单地颠倒您的两种方法,从替换B开始,然后到替换C:
function TransposeDown() {
$("body").html($("body").html().replace(/B/g, 'Bb'));
$("body").html($("body").html().replace(/C/g, 'B'));
}
您也可以转置为特殊模式(例如,使用特殊标记在所有转置之前添加前缀),然后确保从正则表达式中排除此标记。 最后,从整个文档中删除特殊模式。 这将花费更长的时间,但是将使您不考虑订单
作为更通用的解决方案,您可以考虑编写同时匹配两者的正则表达式并使用函数确定替换项。 这将适用于任意搜索/替换,因为它一次完成所有操作。
$("body").html($("body").html().replace(/(B|C)/g, function(match) {
switch (match) {
case 'B':
return 'Bb';
case 'C':
return 'B';
}
));
您应该通过使用通用选择器全部选择它们来顺序更改它们,如果元素已更改,则跳过更改。
var rules = [{ regEx: /^C$/g, str: 'B' }, { regEx: /^B$/g, str: 'Bb' }]; function TransposeDown() { $(".hcrd").each(function(index, el) { var $el = $(el); var prevVal = $(el).html(); var newVal = ''; for (var i = 0; i < rules.length; i++) { newVal = $el.html().replace(rules[i].regEx, rules[i].str); if (newVal != prevVal) { $el.html(newVal); break; } } }); }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <button onclick="TransposeDown();">Transpose Down</button> <span class="hcrd">C</span> <span class="hcrd">B</span> <span class="hcrd">C</span>
我会做不同的事情。
<script>
function TransposeDown(){
$("#C").html(text.replace("C", "B"));
$("#B").html(text.replace("B", "Bb"));
}
</script>
<button onclick="TransposeDown();">Transpose Down</button>
<span class="hcrd" id="C">C</span>
<span class="hcrd" id="B">B</span>
<span class="hcrd" id="C">C</span>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.