这就像我想要的那样:
var elite = document.getElementById("elite"),
leet = document.getElementById("leet"),
alphabets = {
a: "4",
b: "8",
e: "3",
g: "6",
i: "1",
o: "0",
p: "9",
s: "5",
t: "7",
z: "2"
},
// words = {
// cool: "kewl",
// dude: "d00d",
// hacker: "h4x0r",
// newbie: "n00b",
// sucks: "sux0r"
// },
words = {
"c00l": "kewl",
"dud3": "d00d",
"h4ck3r": "h4x0r",
"n3w813": "n00b",
"5uck5": "sux0r"
},
wordsArr,
text;
function changeLetters() { // change all letters
text = elite.value.toLowerCase();
for (var i = 0; i < text.length; i++) {
if (alphabets[text[i]]) {
text = text.replace(text[i], alphabets[text[i]]);
}
}
// leet.value = text;
}
function changeWords() { // change special words
wordsArr = text.split(" ");
for (var i = 0; i < wordsArr.length; i++) {
if (words[wordsArr[i]]) {
wordsArr[i] = words[wordsArr[i]];
}
}
}
function tol33t() {
changeLetters();
changeWords();
leet.value = wordsArr.join(" ");
}
elite.addEventListener("input", tol33t);
document.getElementById("btn").addEventListener("click", tol33t);
您可以看到,将单词转换为leet后,我正在替换单词。但是我很想知道如何直接替换单词。我的意思是使用我评论的对象。
从“酷”到“ kwel”,而不是从“ c00l”到“ kewl”
http://jsbin.com/OjEMEqA/1/
***请参阅更新的问题-leet speak translator critical bug
最佳答案
您将必须跟踪文本中被替换的单词,因此它们的单个字母不会被changeLetters()替换。这不必要地复杂。您最好在“ words”对象(“ cool”,“ dude”,...)中的值上运行changeLetters()算法。这样,您可以使字符串文字保持理智(非leet),但可以继续使用当前使用的代码。 (确保将“单词”存储在全局范围内,并且只转换一次“单词”对象。)