2012-06-19 54 views
0
function demoMatchClick() { 
    var validString = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/ 
    var re = new RegExp(validString); 
    if (document.form1.subject.value.test(re)) { 
    alert("Successful match"); 
    } else { 
    alert("No match"); 
    } 
} 

<INPUT TYPE=SUBMIT VALUE="Replace" ONCLICK="demoReplaceClick()"> 

我不能讓它彈出警報彈出我的JavaScript函數來測試一個密碼不起作用

我希望這些規則被強制執行

•Not have upper-case letters. 
•Begin with a letter. 
•Have at least 1 digit(s) not at the beginning and end. 
•Have up to 8 alphanumeric 
•Does NOT have any symbols like @#$ characters (symbols like [email protected]#$%^&*()-+).

我現在使用一個按鈕來執行代碼。

+0

你不能得到任何警報彈出?你在哪裏調用'demoMatchClick()'? –

+1

嘗試使用Javascript正則表達式沙盒,例如http://regexpal.com/。另外,當'validString'已經是一個正則表達式時,爲什麼你要'新的RegeExp'? – 2012-06-19 14:02:41

+9

從安全的角度來看,你的規則非常糟糕。你告訴一個攻擊者,第一個字符肯定是一個字母,密碼不是以數字結尾,所有字符都是小寫字母。最大長度只有8個字符。它壞了。讓用戶擁有冗長的密碼,不需要強制執行,更安全(確實只需要最小長度)。 –

回答

1

好吧,我想這正則表達式適合您的規則...

var rules = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/; 

但我覺得有你的代碼,我想指出哪幾個問題。不要把它當作個人冒犯,請相信我,我實際上爲你節省了很多時間和精力。

首先,有一個標準規則:每個函數只應做一件事 - 但要做的很好(或者他們說,這些完美主義者!)。您的代碼與DOM提取緊密結合在一起:當我的環境粘貼失敗時,我感到非常驚訝!只有當我注意到document.forms呼叫。這裏並不是真的需要:只需要構建一個帶有一個參數的函數即可,然後使用從其他地方提取的值調用該函數。這樣,順便說一句,你可以很容易地分開錯誤的原因:它可以在DOM部分,也可以在函數內。其次,Regexes真的非常接近被認爲是JavaScript中的一等公民(不像在Perl中,但仍比其他一些語言更接近)。這意味着您可以按原樣編寫正則表達式文本,並在以後使用它 - 不需要新的Regexp構造。

與所有的說,我會寫你的代碼...

function validatePassword(password) { 
    var rules = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/; 
    return rules.test(password); 
} 

...然後像使用它...

var password = document.form1.subject.value; 
alert(validatePassword(password) ? 'Success! :)' : 'Failure... :('); 

附:是的,Riccardo是正確的:對密碼設置過於嚴格的規則 - 並遭受縮小搜索攻擊者範圍的後果。在Javascript中看到驗證規則很容易:甚至混淆器也沒有多大幫助。

1

這裏是修改後的代碼:

function demoMatchClick(input) { 
    var validString = /^[a-z](?=[a-z]*[0-9])[a-z0-9]{0,6}[a-z]$/; 
    if (validString.test(input)) { 
    alert("Successful match"); 
    } else { 
    alert("No match"); 
    } 
} 


demoMatchClick("hello world"); 

validString變量已經是一個正則表達式對象並可以直接使用它,另外。測試()方法屬於Regex對象不是字符串。