2016-07-19 67 views
0

我想檢查我的字符串是否遵循這個規則?如何檢查字符串是否包含某些內容?

  • 至少6個字符
  • 最多40個字符
  • 它同時包含數字和字母

我想我必須使用向前看。所以這是我到目前爲止已經試過:

if (preg_match($string, "/^((?!=[0-9]{1,})(?!=[a-zA-Z]{1,})){6,40}$/")) { 
    // following 
} else { 
    // not following 
} 

但我的模式doesn't work correctly。我該如何解決它?

+0

你爲什麼使用負向預覽? –

+0

@AnshulRai都不會工作.. *負面/積極的前瞻性* –

+0

你的'preg_match'是倒置的,正則表達式應該是第一個。這是爲了驗證密碼嗎? – chris85

回答

2

爲什麼要建立一個複雜的正則表達式時,你可以測試你想要的條件是什麼?

function isValid($string) { 
    return strlen($string) >= 6 && 
      strlen($string) <= 40 && 
      preg_match("/\d/", $string) && 
      preg_match("/[a-zA-Z]/", $string); 
} 

// Negative test cases 
assert(!isValid("hello")); 
assert(!isValid("2shrt")); 
assert(!isValid("This one is way 2 long! This one is way 2 long! This one is way 2 long!")); 
assert(!isValid("abcdef")); 
assert(!isValid("123456")); 

// Positive test cases 
assert(isValid("abcde2")); 
assert(isValid("12345a")); 
+0

看起來不錯。 thx +1 –

1

你可能不需要這麼多的正則表達式,它可能會過度複雜。

我想這給一個嘗試:

if(strlen($string) >= 6 && strlen($string) <= 40 && preg_match("/[a-z]/i", $string) && preg_match("/[0-9]/", $string)) { 
    //Matches rules 
else { 
    //Doesn't match 
} 
+0

您的模式與此'53test'不匹配。因爲在這個例子中數字是第一位的。 –

+0

@MartinAJ修復它。 – ComputerLocus

+0

不需要第二個正則表達式中的「+」。 – smarx

1

,如果你不關心什麼是在比賽中,如果你只是要檢查的條件...你可以試試這個

^(?=)([0-9]|[a-zA-Z]){6,40}$

^ - starting with 
?= - followed by 
{6,40} - length 
$ - end 

編輯:關於這裏的評論修改後的正則表達式:

^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]){6,40}$

說明

`?=` Positive Lookahead match any character followed by 0-9 OR 
`?=` Positive Lookahead match any character followed by a-z or A-Z 
`([a-zA-Z0-9])` Followed by anything in numbers or letters 
`{6,40}` length between 6,40 

EDIT 2

經過進一步評論這個表達式應該匹配:

^(?=.*[0-9])(?=.*[a-zA-Z])(.*){6,40}$類似的東西!a1234!-aquy67!

+0

你的模式匹配一​​個沒有任何數字的字符串https://regex101.com/r/cX0mB4/4 –

+1

或者一個只有數字的字符串。 – smarx

+0

我相信這會拒絕「abc123 !!!」。你應該使用'.'而不是'[a-zA-Z0-9]'。 – smarx

-1
if (preg_match($string, "/^[\d\w]{6,40}$/")) { 
    // following 
} else { 
    // not following 
} 
+1

我相信「111111」會通過你的測試。 – smarx

+0

你應該添加一個解釋。另外'\ w'超過'a-zA-Z'和'0-9' .. – chris85

+0

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。 – abarisone

1

老實說,在PHP中處理這個問題的最好方法是不使用正則表達式。 PHP有一系列內置於該語言中的「ctype」方法(docs here),以允許您確定字符類型,這些方法比Regex更容易使用。不要誤解我的意思Regex是一個強大而強大的工具,但對於這個問題太複雜了。即使您需要使用正則表達式來擴展我的解決方案以適應稍後的複雜模式匹配,您也可以根據您的特定需求添加它,而不必使用它來確定字符類型。

我會認真地建議您編寫一系列非常小的函數/方法,然後您可以將它們組合在一起,以檢查您正在驗證的字符串是否通過了所有條件,如下所示(可以將該示例粘貼到文件中並在命令行運行它來查看類定義下面從腳本輸出):

<?php 

/* Example written assuming that these methods are all 
* part of a Class, hence the access declarations etc. 
* If you want to write them as a function library that 
* would work fine too 
*/ 

class InputValidation { 

    const MIN_LENGTH = 6; 
    const MAX_LENGTH = 40; 

    public function isLongerThanMinLength($text) { 
     $len = strlen($text); 
     if ($len > self::MIN_LENGTH) { 
      return TRUE; 
     } else { 
      return FALSE; 
     } 
    } 

    public function isShorterThanMaxLength($text) { 
     $len = strlen($text); 
     if ($len <= self::MAX_LENGTH) { 
      return TRUE; 
     } else { 
      return FALSE; 
     } 
    } 

    public function hasAlphaAndDigitChars($text) { 
     if (ctype_alpha($text) || ctype_digit($text)) { 
      return FALSE; 
     } else { 
      if (ctype_alnum($text)) { 
       return TRUE; 
      } else { 
       return FALSE; 
      } 
     } 
    } 

    public function validInput($text) { 
     if (!$this->isLongerThanMinLength($text)) { 
      return FALSE; 
     } 
     if (!$this->isShorterThanMaxLength($text)) { 
      return FALSE; 
     } 
     if (!$this->hasAlphaAndDigitChars($text)) { 
      return FALSE; 
     } 
     return TRUE; 
    } 
} 

$inst = new InputValidation; 

$test1 = "Hello"; // too short 
$test2 = "pneumonoultramicroscopicsilicovolcanoconiosis"; // too long 
$test3 = "pneumonoultramicroscopicsil1covolcanocon"; // right length and includes at least one number 
$test4 = "123456789123456789"; // right length, but no alphabet chars 
$test5 = "HelloMyName"; // right length, but no numeric chars 
$test6 = "Hello My Name"; // right length, but has whitespace 
$test7 = "Hello^My%Name1"; // right length, but has 'special' chars 

print "\n"; 
var_dump($inst->validInput($test1)); 
print "\n"; 
var_dump($inst->validInput($test2)); 
print "\n"; 
var_dump($inst->validInput($test3)); 
print "\n"; 
var_dump($inst->validInput($test4)); 
print "\n"; 
var_dump($inst->validInput($test5)); 
print "\n"; 
var_dump($inst->validInput($test6)); 
print "\n"; 
var_dump($inst->validInput($test7)); 
print "\n"; 
print "\n"; 

exit(); 
?> 

這樣,您就可以使用不同的驗證方法,通過放在一起,以增加此驗證的複雜性,或創建新的驗證以不同方式使用現有規則,或通過添加新的簡短方法輕鬆添加新規則。

+0

Nice ... thx +1 –

+0

感謝@MartinAJ - 我仍然使用PHP,而不是我喜歡的,但是當我這樣做時,我採用了很多來自其他編程語言的習語,以使我的代碼更具可讀性和可重用性,所以它更容易組合在一起。我認爲一般而言,PHP代碼可以從寫得更像習慣Ruby,真正受益,使用小巧簡潔的函數,這些函數在合成或鏈接中被調用,特別是如果您有一個良好的IDE和/或調試器來遵循這些值從功能到功能。 –

相關問題