본문 바로가기

old

문자+숫자[+특수문자] 정규식

$regex = '/^(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^*()\-_=+\\\|\[\]{};:\'",.<>\/?])*.{8,}$/i';


echo preg_match($regex, $str) ? 'ok' : 'fail';


문자+숫자(+특수문자) 조합 8자리 이상의 문자열을 체크하는 정규식이다. 마지막 부분의 *.{8,}에서 *를 빼면 문자+숫자+특수문자 세 가지의 경우가 모두 포함된다.


특수문자는 키보드로 입력할 수 있는 모든 특수문자를 대상으로 했다.

`~!@#$%^&*()-_=+\|[]{};:'",.<>/?


PHP에서는 역슬래시(\)를 쓰려면 역슬래시로 escape를 시켜줘야되고,

정규식 문법에서도 마찬가지로 escape를 해야하므로 총 2번의 escape가 필요하다.

즉 PHP에서 정규식 검사 패턴으로서 역슬래시 문자를 포함하고 싶다면 역슬래시가 3번 (\\\)들어가야 된다.


또한 따옴표(', ")도 PHP에선 escape해야 하므로 패턴 문자열을 지정할 때 '(작은따옴표)로 시작할지, "(큰따옴표)로 시작할지에 따라 패턴에 들어가는 해당 따옴표를 역슬래시로 escape해야 한다.

위의 예제같은 경우 $regex = ''; 로 지정했으므로, 안에 패턴으로 들어가는 '(작은따옴표) 의 경우 escape해서 \'가 되었다. 단, 자바스크립트에서의 정규식 변수는 /로 시작해서 /로 끝나므로 ', " 둘다 escape가 필요없다.


* 참고로 [ ] 사이에 들어가는 정규식 특수문자(^, *, +...)는 escape가 필요없다. 하지만 [ ]규칙의 기본 사용문자 '[', ']', '-' 이 세가지와 정규식 문법 자체의 시작과 끝을 나타내는 슬래시 '/'는 escape를 해야 한다.

* 위의 말이 이론적으로 맞는지는 모르겠다. 대부분의 설명에서는 그냥 "[ ] 안에 들어가는 특수문자는 escape가 필요없다"라고만 나와있지, 실제로 사용할 때는 위와 같이 네 가지의 문자의 경우엔 escape가 필요했다.