-->

莱特说译者严重错误(leet speak translator critical bug)

2019-10-19 05:07发布

昨天我张贴关于我的莱特的问题发言的JavaScript应用程序- 制作莱特说翻译

今天老化有关张贴。 我已经提高了代码,并最终有一个关键的问题。

这里是应用程序- http://jsbin.com/azIQiVi/1

乍一看,你会觉得它工作正常。 但实际上不是。

它不能改变类的字眼"hacker""cool" ,当连接一些标点符号像dotcommanewline等。

例如,如果你写"He is a cool hacker" ,将其转换为"h3 15 4 kewl h4x0r" ,这很好。

但是,如果你写的"He is a cool hacker." (注意句号),将其转换为"h3 15 4 kewl h4ck3r."

应该将其转换为"h3 15 4 kewl h4x0r."

希望你明白我的意思。

我无法来解决这个问题,任何想法?

这里是代码:

// http://en.wikipedia.org/wiki/Leet
// http://www.catb.org/jargon/html/crackers.html

var words = {
  "am": "m",
  "are": "r",
  "at": "@",
  "thanks": "thx",
  "your": "ur",

  "cool": "kewl",
  "defeated": "pwned",
  "dude": "d00d",
  "fear": "ph33r", // or ph34r
  "fool": "f00",
  "freak": "phreak",
  "hacker": "h4x0r",
  "lamer": "l4m3r",
  "mad": "m4d",
  "newbie": "n00b",
  "own": "pwn",
  "phone": "fone",
  "porn": "pr0n", // or n0rp
  "rocks": "roxxorz",
  "skill": "sk1llz",
  "sucks": "sux0r",
  "the": "t3h",
  "uber": "ub3r", // or |_|83r
  "yay": "w00t",
  "yo": "j0",
  "you": "j00" // or U
};
var alphabets = {
  "a": "4",
  "b": "8",
  "e": "3",
  "f": "ph",
  "g": "6", // or 9
  "i": "1", // or |
  "o": "0",
  "s": "5",
  "t": "7" // or +

  // advanced
  // "c": "(", // or k or |< or /<
  // "d": "<|",
  // "h": "|-|",
  // "k": "|<", // or /<
  // "l": "|", // or 1
  // "m": "|\\/|",
  // "n": "|\\|",
  // "p": "|2",
  // "u": "|_|",
  // "v": "/", // or \/
  // "w": "//", // or \/\/
  // "x": "><",
  // "y": "'/"
};

var elite = document.getElementById("elite"),
  leet = document.getElementById("leet"),
  randomcase = document.getElementById("randomcase");

function changeLetters(text) { // change letters
  text = text || elite.value.toLowerCase();
  for (var i = 0; i < text.length; i++) {
    if (alphabets[text[i]]) {
      text = text.replace(text[i], alphabets[text[i]]);
    }
  }
  return text;
}

function changeWords() { // change special words
  var wordsArr = changeLetters().split(" ");
  for (var i = 0; i < wordsArr.length; i++) {
    if (words[wordsArr[i]]) {
      wordsArr[i] = words[wordsArr[i]];
    }
  }
  return wordsArr.join(" "); // text
}

function randomizeCase() { // RANdOMiZE CAsE
  var text = changeWords();
  for (var i = 0; i < text.length; i++) {
    if (Math.random() > 0.5) {
      text = text.replace(text[i], text[i].toUpperCase());
    } // else keep lower case
  }
  return text;
}

(function() { // l33t the words object
  for (var word in words) {
    if (words.hasOwnProperty(word)) {
      words[changeLetters(word)] = words[word];
      delete words[word];
    }
  }
}());

function tol33t() {
  leet.value = randomcase.checked ? randomizeCase() : changeWords();
}

elite.addEventListener("input", tol33t);
document.getElementById("btn").addEventListener("click", tol33t);

Answer 1:

由一个空间拆分的话你的做法是(因为你已经注意到)不工作的标点符号。 所以,更好的办法是识别单词一个个注意标点符号。

这其中使用replace()字符串类型的功能。 它通过从你的字典中的相应单词替换所有找到的匹配。 正则表达式模式[^,\.\s]+检测到不逗号,点或白空间(空格,制表符,换行符等)字符的任意组合。

function changeWords() {
    // change special words 
    return changeLetters().replace(
        /[^,\.\s]+/g,
        function(m) {
            return words[m] ? words[m] : m;
        }
    );
}


文章来源: leet speak translator critical bug
标签: javascript