2013-08-03 50 views
1

好吧,我使用下面的代碼(其中$password =後密碼變量)。這是一個大型表單驗證代碼的一部分,並且這行代碼似乎在它不應該觸發時觸發。我擔心它的某些部分已被棄用。我試過輸入pass123A,Password121Password,它們都會觸發這段代碼。爲什麼?Preg_match觸發它不應該

elseif(preg_match("/^[a-zA-Z0-9]$/", $password) == 0) 
echo('Error - the password can only contain alpha-numeric chars!'); 
+1

你的問題與MySql有什麼關係? – peterm

+3

RegExp只會匹配一個字符。嘗試在「]」後添加「+」,並刪除不必要的「^」和「$」爲您的特定情況:/ [a-zA-Z0-9] +/ –

+1

*爲什麼*你是否像這樣限制密碼? – DCoder

回答

3
preg_match("/^[a-zA-Z0-9]$/", $password) 

...將只匹配單個字符的密碼。

preg_match("/^[a-zA-Z0-9]*$/", $password) 

...應該更好地工作。

也許我應該注意到,這也會匹配一個空的密碼,但我認爲你需要單獨檢查長度。

編輯:如果由於SQL不安全感而限制密碼,您應該切換到PDO或MySQLi並使用參數化查詢,這將允許您存儲任何字符串,而無需特殊處理特殊字符(如'),這將使SQL遍佈您的網站更安全。

而且,如果你存儲的明文密碼,無論如何,你應該看看散列他們:)

+0

正如我在上面的評論中所說的那樣,「^」真的有必要嗎?僅僅因爲如果所有接受的字符都是字母數字的,沒有特定的首字母,那麼「^」就沒有必要了,不是嗎?請注意,我並不是說它不起作用,我想知道這是否有必要。 –

+0

還有一個空白的密碼! :) – vee

+1

@AlejandroIván如果刪除'^'和'$',它將匹配字符串中的任何地方,而不是整個字符串。換句話說,'/ [a-zA-Z0-9] + /'將匹配其中包含_any_字母數字字符的任何字符串。我們想匹配一個字符串,其中_all_字符是字母數字。 –

0

您可以使用像這樣:+$

if (...) 
    // do anything 
elseif(!preg_match("/^[a-zA-Z0-9]+$/", $password)) 
    echo('Error - the password can only contain alpha-numeric chars!'); 

使用+$,而不是*$

*允許空字符串。如果$password發送爲空,則不匹配。

相關問題