2012-07-03 2 views
4

스크립트에서 원하는 효과를 얻지 못했습니다. 비밀번호에 A-Z, a-z, 0-9 및 특수 문자가 포함되기를 원합니다.암호 유효성 검사를위한 PHP 정규식

  • AZ
  • AZ
  • 0-9> = 2
  • 특수 문자> = 2
  • 문자열 길이> = 8

그래서 내가 할 수있는 사용자를 강제 할 적어도 2 자릿수와 적어도 2 개의 특수 문자를 사용하십시오. 좋아, 내 스크립트가 작동하지만 다시 숫자 또는 문자를 사용하도록 강요합니다. 나는 그것을 원하지 않는다. 예 : 암호 testABC55 $$는 유효합니다. 그러나 나는 그것을 원하지 않습니다.

대신 $ ABC5 # 8 테스트를 유효하게하고 싶습니다. 그래서 기본적으로 digits/special char은 동일하거나 diff -> 될 수 있지만 문자열에서 분리되어야합니다.

PHP 코드 : 당신이 ("읽기" 형식을 사용하여 2 개 이상의 숫자와 스펙 기호

A-Z 
a-z 
0-9 > 2 
special chars > 2 
string length >= 8 
+0

그래, 그 코드의 문제점은 무엇입니까? –

+0

저는이 것을 하나의 정규식으로 결합 할 수 있다고 확신합니다. – Tibor

+0

그러나 코드는 원하는 효과를 내지 않습니다. 위의 예제를 참고하십시오. – fyz

답변

12

을 요구하기 때문에

$uppercase = preg_match('#[A-Z]#', $password); 
$lowercase = preg_match('#[a-z]#', $password); 
$number = preg_match('#[0-9]#', $password); 
$special = preg_match('#[\W]{2,}#', $password); 
$length = strlen($password) >= 8; 

if(!$uppercase || !$lowercase || !$number || !$special || !$length) { 
    $errorpw = 'Bad Password'; 
+0

오메가가 전송됩니다. 귀하의 회신에 감사 드리며 초급자이므로 RegEx 양식이 혼란 스럽습니다. 그 코드를 조각으로 자세히 설명해 주시겠습니까? – fyz

+0

좋은 대답은 .... (? ='예전이나 보살핌? 그런데 설명해 주셔야합니다.) – rekire

+0

@FabioAnselmo - 그러한 정보로 내 대답을 업데이트했습니다. –

1
((?=(.*\d){3,})(?=.*[a-z])(?=.*[A-Z])(?=(.*[[email protected]#$%^&]){3,}).{8,}) 

테스트 $의 ABC5 # 8가 유효하지 않습니다 당신은 정규식 초보자이기 때문에 더 짧게 최적화 될 수 있습니다.) >>

^(?=.{8})(?=.*[A-Z])(?=.*[a-z])(?=.*\d.*\d.*\d)(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d])[-+%#a-zA-Z\d]+$ 

위의 정규식에서 [...]으로 끝나는 특수 문자 세트를 추가하십시오 (여기에 넣은 문자는 - + % #).


는 설명 :

특수 문자를 포함하는 문자열의 길이를 일치하는
^        - beginning of line/string 
(?=.{8})      - positive lookahead to ensure we have at least 8 chars 
(?=.*[A-Z])     - ...to ensure we have at least one uppercase char 
(?=.*[a-z])     - ...to ensure we have at least one lowercase char 
(?=.*\d.*\d.*\d    - ...to ensure we have at least three digits 
(?=.*[^a-zA-Z\d].*[^a-zA-Z\d].*[^a-zA-Z\d]) 
           - ...to ensure we have at least three special chars 
            (characters other than letters and numbers) 
[-+%#a-zA-Z\d]+    - combination of allowed characters 
$        - end of line/string 
+0

혼란스러워서 죄송합니다. 코드에 유의하십시오. 문자가 인접하지 않기 때문에 유효하지 않습니다. 예를 들어 내가 사용하는지 확인합니다 : test $$ ABC44 예제를 수정합니다. 죄송합니다 – fyz

+0

스위치 {3,}을 (를) 숫자 및 사양 기호로 바꾸십시오. 그러면 –

관련 문제