2013-09-25 120 views
1

好的,所以我正在開發一個登錄系統,並且我正在努力防止用戶輸入我不想要的,我的驗證的一部分是確定用戶名只是字母數字,以及密碼,並對電子郵件進行單獨驗證。所以我發現了幾個在php.net上使用的例子,因爲在php中所有的東西,這些preg匹配的東西對我來說是毫無意義的。Preg_Match假結果

我遇到的問題是誤報。前兩個返回false爲true,並且電子郵件驗證按預期工作,但對於我的生活,我不知道爲什麼。我可以簡單地刪除!在前面強迫我的表達意圖的答案,但我實際上想知道爲什麼兩個語句構造幾乎完全相同的返回不同的布爾值。

<?php 
$user = "testing2"; 
$pass = "testing1"; 
$email = "[email protected]"; 
    if (!preg_match('/[^A-Za-z0-9]+/', $user)) { 
     echo "Username must only contain English letters and numbers<br />"; 
    } 
    if (!preg_match('/[^A-Za-z0-9]+/', $pass)) { 
     echo "passw must only contain English letters and numbers<br />"; 
    } 
    if (!preg_match('/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@([a-z0-9])*(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*$/i', $email)) { 
     echo "Please use a valid email"; 
    } 
?> 
+3

*「passw只能包含英文字母和數字」* - 爲什麼? – Ryan

+0

因爲我希望在使用精確過濾之前讓代碼正常工作。 – Pyro4816

+0

這裏有一個函數密碼檢查:'if(strlen($ pass)<8){echo「passw太短,至少使用8個字符;越多越好。 }' –

回答

2

因爲你的用戶名和密碼否定字符類,你應該刪除的條件的否定:

if (preg_match('/[^A-Za-z0-9]/', $user)) { ... } 

上面的意思是「如果$user包含非字母數字的任何字符」,所以似乎是你想警告的。換句話說,你的前2個正則表達式實際上是,看起來爲無效值。

由於^被用於否定前2個正則表達式中的字符類,但在電子郵件正則表達式中被用作錨點(字符串的開始),所以可能會引起混淆。

另一種方法是使第一正則表達式2與去年保持一致,並讓他們只認準有效值:

if (!preg_match('/^[A-Za-z0-9]+$/', $user)) { ... } 

以上可以確保的$user每個字符爲字母數字字符。

+0

任何人都有正則表達式分解的好地方嗎?我已經搜索了一個,所有內容似乎都是爲那些已經這麼做了多年的人編寫的,對我來說,我似乎無法理解他們。 – Pyro4816

+0

@ Pyro4816:http://docs.python.org/3.4/howto/regex.html#regex-howto – Ryan

+2

你應該拿掉'+',這是不必要的。 – Ryan

0

你可以做兩個不同的東西:

認準正確的格式; 如果不是字符串只是數字字母的字符

if (!preg_match('/[A-Za-z0-9]+/', $user)) 

看的格式不正確; 如果字符串中包含非字母數字字符的char

if (preg_match('/[^A-Za-z0-9]/', $user)) 

你混他們兩個!