2017-09-15 17 views
0

我有一個我的網站的註冊頁面。正則表達式使用JavaScript而不是PHP

當用戶填寫表單時,他們通過JavaScript正則表達式進行實時驗證,工作正常。這樣做是通過:當用戶通過此提交表單

var password = document.getElementsByName("password")[0].value; 
var pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)([a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\]^_`{|}~]{6,})$/; 
if(pattern.test(password)){ 
    document.getElementById("check_password").innerHTML = "Password is valid."; 
} else { 
    document.getElementById("check_password").innerHTML = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

PHP的正則表達式使用:

if(!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)([a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\]^_`{|}~]{6,})$/", $_POST["password"])){ 
     $error = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

然而,PHP保持甚至當JavaScript不扔了錯誤。這兩個正則表達式都是相同的,並且已經在PHP設置和JavaScript設置中進行了測試。但它在JavaScript中工作,但不是PHP!

爲什麼它不能在PHP中工作,我該如何解決這個問題?

+0

它會拋出什麼錯誤。 Php不會毫無理由地拋出錯誤 – Andreas

+0

你絕對確定'$ _POST ['password']'包含密碼? – Jeff

+0

@Andreas PHP不會拋出錯誤,這是我的錯誤信息。基本上,問題是正則表達式不匹配。 – ngmh

回答

5

問題來自反斜槓。爲了搞清一個反斜槓在一個PHP正則表達式的字符串,則需要使用4個反斜槓(你需要爲正則表達式逃脫一次的字符串,一旦因爲它也是一個正則表達式特殊字符):

if(!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)([a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\\\]^_`{|}~]{6,})$/", $_POST["password"])){ 
    $error = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

注意它是相同的,如果你決定在一個JavaScript字符串的正則表達式的構造函數定義模式:

var re = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)([-a-zA-Z0-9!\"#$%&'()*+,./:;<=>[email protected]\\[\\]\\\\^_`{|}~]{6,})$"); 

順便說一句,爲了避免這個問題,角色職業[a-zA-Z0-9!\"\#$%&\'()*+,\-.\/:;<=>[email protected]\[\\\\\]^_``{|}~]可以縮短[!-~]。此外,你並不需要一個捕獲組:

if(!preg_match("/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[!-~]{6,}$/", $_POST["password"])){ 
    $error = "Password is invalid. It should have at least 6 characters, and 1 lowercase letter, uppercase letter, and number."; 
} 

要完成,還有JavaScript和PHP之間的錨$小的差異。在兩種語言中,它匹配字符串的末尾(默認情況下不帶多行模式),但在PHP中,它也匹配行尾,當緊跟在字符串結尾之前的換行符\n之後。換句話說,字符串"Password0\n"也匹配您的模式,因爲0\n(位於\n的位置)之間的$錨點匹配。

爲了避免這個問題,兩種可能性:

  • 可以使用D modifier (PCRE_DOLLAR_ENDONLY)
    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[!-~]{6,}$/D
  • 或更改$\z(總是隻有字符串任何方式結束比賽):
    /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[!-~]{6,}\z/
+0

是的!這是對的。實際上它應該是2個反斜槓,因爲我試圖包括整個集合,而4將是浪費,因爲4將是毫無意義的。謝謝一堆! – ngmh

+0

你能解釋爲什麼它可以縮短爲[! - 〜] – ngmh

+0

@ngmh:這是一個包含所有字符的簡單字符範圍,請參閱ascii表。 –

-1

你應該檢查的preg_match回報:

返回INT,如果沒有找到(0)。 如果找到,則返回INT(1)。 如果發生錯誤,則返回BOOL(false)。

+0

所以!pregmatch不起作用? – ngmh

+0

我必須使用preg_mach()== 0? – ngmh

+0

確切地說,你正在檢查它是否返回false,這意味着如果它發生錯誤。 – PocketKiller

相關問題