我正在处理一些我正在处理的JavaScript问题。目的是检查已知错误密码列表的输入。那部分很简单。但是它也应该能够检查这些密码的“1337”版本。基本上它需要能够检查密码中的数字并将其转换为英语,然后运行已知的错误密码功能。我试图设置一个函数来完成Making a leet speak translator,但它只是部分工作,我很困惑为什么,因为它没有正确迭代。多出一次的字母只会在第一次被替换。还有问题是l或i是相同的数字。我希望有人能看一眼吗?
<script>
var LettersEnglish =
new Array('o', 'i', 'l', 'e', 'a', 's', 't');
var LettersLeet =
new Array('0', '1', '1', '3', '4', '5', '7');
function changeLetters() { // change all letters
var text = document.getElementById("password").value;
for (var i = 0; i < text.length; i++) {
text = text.replace(LettersLeet[i], LettersEnglish[i]);
}englishPasswords(text);
}
function englishPasswords(convertedstring) {
var myarr = ["password", "letmein", "dragon", "shadow", "joker"];
var string = (myarr.indexOf(convertedstring) > -1);
if (string === true){
document.getElementById("output").innerHTML = convertedstring + " is a bad password";
}else{
document.getElementById("output").innerHTML = convertedstring + " is an acceptable password";
}
}
</script>
答案 0 :(得分:1)
您似乎正在迭代text.length
而不是LettersEnglish.length
或LettersLeet.length
。这意味着如果您的密码短于这些数组的长度,则不会替换其中的所有字符。
答案 1 :(得分:1)
@MTCoaster是正确的,因为你正在迭代错误的东西。你需要这样的东西:
for (var i = 0; i < LettersLeet.length; i++) {
text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish[i]);
}
请注意,replace()
调用现在使用正则表达式作为第一个参数,并且使用“global”标志创建正则表达式。这允许replace()
替换所有匹配项。你调用它的方式,以字符串作为第一个参数,只会替换第一个匹配项。
关于i / l映射,你不是将它们都映射到1,而是反过来,在检查错误密码时,你需要将1作为i和l对待。 1不可能同时映射到两者。一种简单的方法可能是:
var LettersEnglish1 =
new Array('o', 'i', 'e', 'a', 's', 't');
var LettersEnglish2 =
new Array('o', 'l', 'e', 'a', 's', 't');
var LettersLeet =
new Array('0', '1', '3', '4', '5', '7');
然后,在changeLetters()
内:
var text1 = document.getElementById("password").value,
text2 = text;
for (var i = 0; i < LettersLeet.length; i++) {
text1 = text1.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish1[i]);
text2 = text2.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish2[i]);
}
//Now check both text1 and text2 for validity
完整的解决方案应该检查i和l的所有可能的排列。例如,如果密码为1n1t1a1
,则需要检查2 ^ 4(16)个不同的替换密码。
最后,一个风格建议:
var LettersEnglish1 =
new Array('o', 'i', 'e', 'a', 's', 't');
var LettersEnglish2 =
new Array('o', 'i', 'l', 'e', 'a', 's', 't');
var LettersLeet =
new Array('0', '1', '3', '4', '5', '7');
通常写为
var LettersEnglish1 = ['o', 'i', 'e', 'a', 's', 't'],
LettersEnglish2 = ['o', 'l', 'e', 'a', 's', 't'],
LettersLeet = ['0', '1', '3', '4', '5', '7'];
有些人可能更愿意使用多个var
语句,但大多数人使用数组文字语法而不是new Array()
。
答案 2 :(得分:0)
因为我们有一个已知的错误密码列表,后来被告知,密码中只有一次1密码的实例是我接下来的答案。为了检查除L之外的所有字母,我使用了@ PeterHerdenborg的答案。
var LettersEnglish1 = ['o', 'e', 'a', 's', 't', 'i'],
LettersLeet = ['0', '3', '4', '5', '7', '1'];
function changeLetters() {
var text = document.getElementById("password").value;
for (var i = 0; i < LettersLeet.length; i++) {
text = text.replace(new RegExp(LettersLeet[i], 'g'), LettersEnglish1[i]);
//console.log(text);
englishPasswords(text);
}
}
function englishPasswords(text) {
var myarr = ["password", "letmein", "dragon", "shadow", "joker"];
var string = (myarr.indexOf(text) > -1);
if (string === true){
document.getElementById("output").innerHTML = text + " is a bad password";
}else{
checkForLs(text);
}
}
function checkForLs(text){
text = text.replace('i','l')
if(text == 'letmein'){
document.getElementById("output").innerHTML = text + " is a bad password";
}else{
document.getElementById("output").innerHTML = text + "thats an acceptable password";
}
}