这就像我想要的那样:

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),但可以继续使用当前使用的代码。 (确保将“单词”存储在全局范围内,并且只转换一次“单词”对象。)

10-02 15:33