반응형
PHP 회원가입 정규표현식 완벽 가이드
필수 검증 항목
회원가입 필수 검증 요소
- 아이디 (영문, 숫자)
- 비밀번호 (특수문자, 영문, 숫자 조합)
- 이메일
- 이름 (한글/영문)
- 전화번호
- 생년월일
검증 클래스 구현
class ValidationHelper {
private $errors = [];
// 에러 메시지 설정
public function addError($field, $message) {
$this->errors[$field] = $message;
}
// 에러 메시지 반환
public function getErrors() {
return $this->errors;
}
// 검증 통과 여부
public function isPassed() {
return empty($this->errors);
}
}
세부 검증 함수
1. 아이디 검증
function validateUserId($userId) {
// 영문 소문자, 숫자 조합 5~20자
$pattern = '/^[a-z0-9]{5,20}$/';
// 숫자로 시작하는 경우 제외
if (preg_match('/^[0-9]/', $userId)) {
return false;
}
return preg_match($pattern, $userId);
}
2. 비밀번호 검증
function validatePassword($password) {
// 최소 8자, 최대 20자
// 영문 대소문자, 숫자, 특수문자 중 3가지 이상 조합
$pattern = '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#])[A-Za-z\d@$!%*?&#]{8,20}$/';
// 연속된 문자/숫자 체크 (4자리 이상)
if (preg_match('/(.)\1{3,}/', $password)) {
return false;
}
return preg_match($pattern, $password);
}
3. 이메일 검증
function validateEmail($email) {
// RFC 5322 표준 준수
$pattern = '/^(?:[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/i';
return preg_match($pattern, $email) && strlen($email) <= 254;
}
4. 이름 검증
function validateName($name, $type = 'ko') {
if ($type === 'ko') {
// 한글 이름 2~5자 (공백 허용하지 않음)
return preg_match('/^[가-힣]{2,5}$/u', $name);
} else {
// 영문 이름 2~20자 (공백, 하이픈 허용)
return preg_match('/^[a-zA-Z][a-zA-Z\s-]{1,19}$/u', $name);
}
}
5. 전화번호 검증
function validatePhone($phone) {
// 숫자만 추출
$phone = preg_replace('/[^0-9]/', '', $phone);
// 휴대폰 번호 패턴
$mobilePattern = '/^01[016789]\d{7,8}$/';
// 일반 전화번호 패턴
$telPattern = '/^0[2-6]\d{7,8}$/';
return preg_match($mobilePattern, $phone) || preg_match($telPattern, $phone);
}
6. 생년월일 검증
function validateBirthdate($birthdate) {
// YYYY-MM-DD 형식 검증
$pattern = '/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/';
if (!preg_match($pattern, $birthdate)) {
return false;
}
// 날짜 유효성 검증
$parts = explode('-', $birthdate);
$year = intval($parts[0]);
// 현실적인 생년월일 범위 체크 (1900년 이후, 현재까지)
if ($year < 1900 || $year > date('Y')) {
return false;
}
return checkdate($parts[1], $parts[2], $parts[0]);
}
통합 검증 예제
class UserValidator {
private $validation;
public function __construct() {
$this->validation = new ValidationHelper();
}
public function validateRegistration($data) {
// 아이디 검증
if (!validateUserId($data['user_id'])) {
$this->validation->addError('user_id', '아이디는 영문 소문자, 숫자 조합 5~20자여야 합니다.');
}
// 비밀번호 검증
if (!validatePassword($data['password'])) {
$this->validation->addError('password', '비밀번호는 8~20자의 영문 대/소문자, 숫자, 특수문자 조합이어야 합니다.');
}
// 비밀번호 확인 검증
if ($data['password'] !== $data['password_confirm']) {
$this->validation->addError('password_confirm', '비밀번호가 일치하지 않습니다.');
}
// 이메일 검증
if (!validateEmail($data['email'])) {
$this->validation->addError('email', '유효하지 않은 이메일 형식입니다.');
}
return $this->validation->isPassed();
}
}
반응형