$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가 필요했다.
'old' 카테고리의 다른 글
cronolog를 이용한 아파치 로그 일자별 정리 (0) | 2014.07.28 |
---|---|
CI(Codeigniter)의 세션변수 user_data가 공란인 이유 (0) | 2014.06.25 |
LAMP 구축하기 (CentOS 6.5 / MySQL5.6.17 / Apache 2.4.9 / PHP 5.5.12) (0) | 2014.05.27 |
윈도우에서 mysql 설치 시 write configuration file 응답 없음 현상 (0) | 2014.01.14 |
CentOS 6.4에서 qmail 설치하기 (qmail+vpopmail+mysql+dovecot) (0) | 2013.07.11 |