javascript - leet朗读转换器关键的Bug

  显示原文与译文双语对照的内容

昨天我发布了一个问题,认为我的leet说的JavaScript应用程序使一个leet对话。

今天老化过的帖子。 我改进了代码和 finally 有一个关键问题。

下面是应用程序 http://jsbin.com/azIQiVi/1.

乍看一下,你会觉得它的工作很正常。 但其实并不是。

"hacker" 或者 "cool" 附加一些标点字符如 dotcommanewline 等时,它不能改变单词。

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

但是如果你写 "He is a cool hacker." ( 注意 fullstop ),它将转换为 "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);

时间: 作者:

用空格分割单词的方法是( 就像你已经注意到) 不能用标点符号。 因此,更好的方法是通过注意标点来识别单词。

这里函数使用字符串类型的replace() 函数。 它根据字典中相应的单词替换任何找到的匹配词。 正规表达式 Pattern [^,.s]+ 检测不是逗号。点或者空格( 空格。制表符。换行符 等等 )的字符的任何组合。


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

作者:
...