2014-02-13 2 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] 여러 가지 이유로 false입니다

  • PHP에서 정규식 패턴은 대부분의 사용이 /,하지만 당신이 볼 수 있듯이, 내가 ~을 선택이 끝난 한 구분 기호로 둘러싸인해야한다로. 예 : /[a-zA-Z \.\s]/
  • 문자 클래스에는 공백이 포함되어 있고 문자 클래스 \s에도 공백이 포함되어있어 이상합니다. IMO는 사용자 이름이나 암호를 확인하기 위해 탭이 아닌 여백 만 있으면되지만 캐리지 리턴이나 줄 바꿈 문자는 필요하지 않습니다! \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 건설적이고 멋진 제시된 대답. –

관련 문제