2014-02-13 47 views
0

誰能告訴我,什麼在此代碼是錯誤的:PregMatch。空間和@?

if ((!preg_match("[a-zA-Z0-9 \.\s]", $username)) || (!preg_match("[a-zA-Z0-9 \.\s]", $password))); 
exit("result_message=Error: invalid characters"); 
} 

回答

3

有幾件事情是錯誤的。我假設你正在尋找的代碼是:

if (preg_match('~[^a-z0-9\h.]~i', $username) || preg_match('~[^a-z0-9\h.]~i', $password)) 
    exit('result_message=Error: invalid characters'); 

你的代碼有什麼問題?

模式[a-zA-Z0-9 \.\s]是多種原因錯誤:

  • PHP中的正則表達式模式必須由定界符包圍,最常用的是/,但你可以看到,我已經選擇~。例如:/[a-zA-Z \.\s]/
  • 字符類很奇怪,因爲它包含一個空格和包含空格的字符類\s。國際海事組織,檢查用戶名或密碼,你只需要空間,爲什麼不是標籤,但不是回車或換行字符!您可以刪除\s並放置空間,也可以使用與所有水平空白匹配的\h字符類。 /[a-zA-Z\h\.]/(如果你不希望允許標籤,用空格代替\h
  • 點有一個字符類中沒有特殊含義,也不需要進行轉義:/[a-zA-Z\h.]/
  • 你想驗證整個字符串,但您的模式匹配單個字符!換句話說,只有當字符串至少包含一個alnum,一個空格或一個點時,該模式纔會進行檢查。如果你想檢查所有的字符串,你必須使用量詞+和錨點開始^和結尾$的字符串。例如∕^[a-zA-Z0-9\h.]+$/
  • ,您可以通過使用不區分大小寫的修飾符i縮短字符類:/^[a-z0-9\h.]+$/i

但有而不是用!您的preg_match的斷言和測試,如果所有字符否定一個更快的方法,在您想要的字符範圍內,您只能測試字符串中是否有一個您不想要的字符。要做到這一點,你只需要通過在第一位置插入一個^否定字符類:

preg_match('/[^a-z0-9\h.]/i', ... 

(注意^有內部和字符類之外有不同的含義。如果^不在字符類的開始,它是一個簡單的文字字符)。

+2

+1建設性,很好的提出和完整的答案。 –