做一个leet说翻译

时间:2014-01-14 09:23:46

标签: javascript

这就像我想要的那样:

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

2 个答案:

答案 0 :(得分:1)

您必须跟踪文本中替换的单词,因此他们的单个字母不会被changeLetters()替换。这是不必要的复杂。你可以更好地运行你的changeLetters()算法而不是“words”对象中的值(“cool”,“dude”,......)。这样,您可以保持字符串文字清晰(非leet),但您可以继续使用您正在使用的代码。 (确保将“单词”存储在全局范围内,并且只将“单词”对象转换一次。)

答案 1 :(得分:0)

  

我正在寻找一种方法将“酷”,黑客“转换为”kewl“和”haxor“之类的单词直接转换为其他字母,然后使用changelett转换其他字母()

目前,您正在转换字母,然后转换字词。

简单地交换这些操作:

changeWords();
changeLetters();

当然,您必须更改words中的密钥,因为他们现在会在字母转换之前应用