2016-12-05 2 views
1

У меня есть слово: google, и я меняю каждый символ на определенный цвет, но я не могу понять, как делать буквы «o» разными цветамиJavascript .replace() тот же символ отличный результат

Это мой JS:

var text = $("#typed-strings").html().replace(/e/g, '<span class="red">e</span>').replace(/g/g, '<span class="blue">g</span>').replace(/l/g, '<span class="green">l</span>').replace(/o/g, '<span class="yellow">o</span>'); 
 
$("#typed-strings").html(text);
.red { 
 
    color: rgb(219, 50, 54); 
 
} 
 
.blue { 
 
    color: rgb(72, 133, 237); 
 
} 
 
.green { 
 
    color: rgb(60, 186, 84); 
 
} 
 
.yellow { 
 
    color: rgb(244, 194, 13); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="typed-strings">google</div>

может быть, кто-то есть идеи?

Спасибо!

EDIT:

Спасибо всем за такой богатый ответ на мой вопрос был отредактирован модератором, может быть, поэтому вы видели некоторые изменения. Я загрузил эту пробную версию на герою, чтобы сделать вещи проще, но да, у меня есть этот длинный текст, и каждый раз, когда появляется буква «o», мне бы хотелось, чтобы она была красной или желтой, html не имеет значения потому что это чисто для визуализации, но я многое узнал из разговоров - спасибо! это приложение: https://googlefonts.herokuapp.com

EDIT 2: также добавил нерабочую версию в пределах страницы

+0

Вашего HTML, пожалуйста? –

+1

Выполняется ли текст даже до назначения html ...? – Marie

+0

Я вижу, что вам нужны конкретные цвета для конкретных букв, каково правило назначения цветов, когда письмо найдено несколько раз? –

ответ

4

Как уже указывалось ваш вопрос в том, что вы заменяете g с <span class="...">g</span> затем заменить все l's в последней строке, которая заменяет л в классе.

Другой способ использования этой функции - заменить функцию. При использовании функции каждое совпадение заменяется поочередно, и любые сделанные вами замены игнорируются.

Кроме того, вы можете использовать отдельный ключ и логическое значение для отслеживания того, заменили ли вы первый o уже или нет. Я добавил это в свой пример, используя логическое значение как часть замены-ключа для буквы o, чтобы упростить ситуацию.

var replacements = { 
 
    g: '<span class="blue">g</span>', 
 
    o0: '<span class="red">o</span>', 
 
    o1: '<span class="yellow">o</span>', 
 
    l: '<span class="green">l</span>', 
 
    e: '<span class="red">e</span>' 
 
}; 
 

 
var ele = $("#typed-strings"); 
 
var text = ele.html(); 
 

 
var firstODone = false; 
 
text = text.replace(/[gogle]/g, function (letter) { 
 
    var key = letter; 
 
    if (key === 'o') { 
 
    key = key + (+firstODone); //Convert the boolean to an integer, 0 or 1 
 
    firstODone = true; 
 
    } 
 
    
 
    return replacements[key]; 
 
}) 
 
    
 
ele.html(text);
.red { 
 
    color: rgb(219, 50, 54); 
 
} 
 
.blue { 
 
    color: rgb(72, 133, 237); 
 
} 
 
.green { 
 
    color: rgb(60, 186, 84); 
 
} 
 
.yellow { 
 
    color: rgb(244, 194, 13); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="typed-strings">google</div>

Если требуется только JQuery для этого вы можете легко избавиться от него, тоже.Вы можете использовать var ele = document.getElementById("typed-strings"); , чтобы получить свой элемент и ele.innerHTML , чтобы получить и установить html в элемент. .: например ele.innerHTML = text

+1

Спасибо, я этого не замечал :) – Marie

+1

Я думаю, что OP хочет два разных буквы «o» - вот в чем вопрос. – sinisake

+0

Спасибо за ответ, он очень изящный и логичный, но, к сожалению, он разбивает мой код, я забыл упомянуть, что я оживляю буквы, с другой библиотекой, и, возможно, это усложняет работу. Ошибка, которая Я получаю это: TypeError: undefined не является объектом оценки («text.replace»). Я добавил ссылку на сайт в моем исходном вопросе, если это помогает. –

2

Вы можете использовать следующее регулярное выражение:

letter + '{1}(?![^<]*\>)' 

выше заменит только строчные однобуквенные буквы G, которые не находятся внутри бирки <>, вот пример:

function replaceWithSpanClass(string, letter, className){ 
 
    var regex = new RegExp(letter + '{1}(?![^<]*\>)', 'g'); 
 
    return string.replace(regex, '<span class="' + className + '">' + letter + '</span>') 
 
} 
 

 
var text = 'google'; 
 
text = replaceWithSpanClass(text, 'g', 'red'); 
 
text = replaceWithSpanClass(text, 'o', 'blue'); 
 
text = replaceWithSpanClass(text, 'l', 'yellow'); 
 
text = replaceWithSpanClass(text, 'e', 'green'); 
 

 
document.getElementById('result').innerHTML = text;
.yellow { color: yellow; } 
 
.green { color: green; } 
 
.blue { color: blue; } 
 
.red { color: red; }
<div id="result"></div>

В данном случае это означает, что класс, как yellow не получает его o заменен <span class="blue">o</span>. Таким образом, вы уверены, что вы только изменение вне ваших узлов.

+0

Я думаю, что есть лучшие способы, чем использовать регулярное выражение, чтобы попытаться сопоставить строки, отличные от html. – Marie

+0

@Marie Не стесняйтесь сообщать о них. И в этой заметке вы также используете Regex, и вы решаете ту же проблему по-другому. Но да, нисходящий, если ваш граф выглядит выше, он, вероятно, будет отмечен галочкой. – somethinghere

+0

Я не возражаю regex, но ваш ответ использует регулярное выражение для анализа html, что редко бывает хорошей идеей. – Marie

2
<script type="text/javascript"> 


$(document).ready(() => { 
    let oldStr = $("#typed-strings").html(); 
    let newStr = ''; 

    for(let i = 0; i < oldStr.length; i++) { 
     if (oldStr[i] === 'g') { 
      newStr += '<span class="blue">g</span>' 
     } else if (oldStr[i] === 'o') { 
      newStr += '<span class="yellow">o</span>' 
     } 
     // Add other letters here 
    } 

    $("#typed-strings").html(newStr); 
}); 


</script> 
+0

Возможно, вы захотите добавить 'else {newStr + = oldStr [i]} '.В противном случае буквы, которые вы не нацелили, исчезнут. – somethinghere

+0

Ему нужно будет использовать здравый смысл и заполнить там, где говорится «добавьте другие буквы здесь», но вы правы. Это был просто простой JS/JQuery способ сделать это без Regex's и т. Д. Есть более гладкие ответы, чем мои, но я понял, что я бы выбрал действительно упрощенную простоту. – Brant

0

Вы можете создать функцию, которая будет возвращать цвет буквы и использовать метод замены с функцией обратного вызова, как это:

var colors = { 
    g: 'blue', 
    o: 'yellow', 
    l: 'green', 
    e: 'red' 
}; 
function wrapTheLetter(letter) { 
    var colorClass = colors[letter]; 
    if (letter == 'o') { 
     // update it's color for the future 
     colors.o = 'grey'; 
    } 
    return '<span class="' + colorClass + '">'+letter+'</span>'; 
} 
var text = $("#typed-strings").html().replace(/\w/g, wrapTheLetter); 
$("#typed-strings").html(text); 
+2

Это было не то, о чем спрашивал ОП длинным выстрелом. Это полезно только после того, как OP решила текущую проблему. С текущей проблемой, его пролеты были неправильными для начала. – somethinghere

+0

Обновлено. Это лучше? : P –

+0

Да? По крайней мере, он делает то, о чем попросил ОП. В следующий раз убедитесь, что правильно прочитали вопрос и предоставили соответствующее решение, в противном случае опускаются ваши пути (не мои, я дал вам время, чтобы понять). – somethinghere

Смежные вопросы