몇 가지 문제가 있습니다. 귀하가 찾고있는 코드가 다음과 같다고 가정합니다 :
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', ...
합니다 (^
내부와 문자 클래스 밖에서는 다른 의미를 가지고 있습니다 ^
가에없는 경우 문자 클래스의 시작, 그것은 간단한 문자 그대로의 문자입니다.)
+1 건설적이고 멋진 제시된 대답. –