반응형
Web Development · PHP 정규식 함수
PHP preg_match() — 정규식으로 패턴을 검사하는 함수
반환값 1/0 · 캡처 그룹 · 입력 검증 패턴 · preg_replace 비교 완전 정리
시작 오늘 분석할 코드
preg_match()는 문자열이 정규식 패턴과 일치하는지 검사하는 함수입니다. 일치하면 1, 일치하지 않으면 0을 반환합니다. 세 번째 인수 $matches에는 매치된 내용이 저장됩니다. PHP의 정규식은 Perl 호환 정규식(PCRE)을 사용하며, 패턴은 구분자(보통 /)로 감쌉니다.
<?php $number = "12345"; if (preg_match("/^[0-9]+/", $number)) { // /^[0-9]+/ = 시작부터 숫자 1개 이상 print "숫자입니다."; } else { print "숫자가 아닙니다."; } ?>
실제 출력 미리보기
preg_match("/^[0-9]+/", "12345")
숫자입니다.
반환값: 1
preg_match("/^[0-9]+/", "abc")
숫자가 아닙니다.
반환값: 0
용어 용어 정리
preg_match()정규식 패턴 일치 검사 — 1(일치)/0(불일치)/false(오류) 반환
PCREPerl Compatible Regular Expressions. PHP 정규식의 기반
구분자패턴을 감싸는 문자 — 보통 /, #, ~ 등. "/패턴/" 형태
^문자열의 시작. /^[0-9]/ = 첫 글자가 숫자
$문자열의 끝. /[0-9]$/ = 마지막 글자가 숫자
$matches세 번째 인수 — 매치된 내용 저장 배열. $matches[0]=전체, [1]=첫 그룹
preg_match_all()모든 매치를 배열로 반환 — 여러 개 찾을 때 사용
preg_replace()정규식 패턴 매칭 후 치환 함수 — 검사가 아닌 변환용
1 패턴 기호 빠른 참조
자주 쓰는 정규식 기호 정리
| 기호 | 의미 | 예시 |
|---|---|---|
| ^ | 문자열 시작 | /^A/ → "A"로 시작 |
| $ | 문자열 끝 | /z$/ → "z"로 끝 |
| [0-9] | 숫자 한 글자 | [0-9]+ → 숫자 1개 이상 |
| [a-z] | 소문자 한 글자 | [a-z]{2,} → 소문자 2개 이상 |
| \d | [0-9]와 동일 | \d+ → 숫자 1개 이상 |
| \w | 알파벳+숫자+_ | \w{4,10} → 4~10글자 아이디 |
| + | 1개 이상 | [0-9]+ → 숫자 하나 이상 |
| * | 0개 이상 | [a-z]* → 소문자 0개 이상 |
| {n,m} | n~m개 | \d{2,4} → 숫자 2~4개 |
| i 플래그 | 대소문자 무시 | /abc/i → ABC도 매치 |
2 입력 검증 실전 패턴
전화번호, 이메일, 아이디 검증
// 숫자만 (주문번호, ID 등) preg_match('/^\d+$/', $input); // 한국 휴대폰 번호 preg_match('/^01[016789]-?\d{3,4}-?\d{4}$/', $phone); // 이메일 기본 검증 preg_match('/^[\w.+-]+@[\w-]+\.[a-z]{2,}$/i', $email); // 아이디: 영문+숫자+_ 4~16자 preg_match('/^\w{4,16}$/', $id); // 비밀번호: 8자 이상, 숫자+문자 포함 preg_match('/^(?=.*\d)(?=.*[a-z]).{8,}$/i', $pw);
※ 이메일 검증은 정규식으로는 완벽하지 않습니다. PHP 내장 filter_var($email, FILTER_VALIDATE_EMAIL)이 더 안정적이고 표준에 가까운 검증을 제공합니다.
3 세 번째 인수 $matches — 캡처 그룹
괄호()로 감싼 부분이 $matches 배열에 저장됨
$date = "2026-06-25"; // 괄호로 그룹 캡처 preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $matches); // $matches[0] = "2026-06-25" (전체 매치) // $matches[1] = "2026" (첫 번째 그룹) // $matches[2] = "06" (두 번째 그룹) // $matches[3] = "25" (세 번째 그룹) echo "연도: {$matches[1]}, 월: {$matches[2]}, 일: {$matches[3]}";
반응형
4 preg_replace — 치환 함수 비교
검사는 preg_match, 치환은 preg_replace
// 검사만 (preg_match) if (preg_match('/[^a-zA-Z0-9]/', $str)) { echo "특수문자 포함"; } // 치환 (preg_replace) — 특수문자 제거 $clean = preg_replace('/[^a-zA-Z0-9]/', '', $str); // 전화번호 하이픈 제거 $phone_num = preg_replace('/[^0-9]/', '', $phone); // "010-1234-5678" → "01012345678"
5 preg_match_all — 여러 매치 찾기
문자열에서 패턴 모든 일치 항목 추출
$html = '<a href="page1.php">첫 페이지</a> <a href="page2.php">둘째</a>'; // href 속성 값 전체 추출 preg_match_all('/href="([^"]+)"/', $html, $matches); print_r($matches[1]); // Array ( [0] => page1.php [1] => page2.php )
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| 반환값 혼동 — 1/0/false | if (preg_match(...) == 1) 과 if (preg_match(...)) 가 다름 | 보통 if (preg_match(...)) 로 충분 — false(오류)도 걸림 |
| ^ $ 없이 부분 검사 | /[0-9]+/ → "abc123def"도 통과 (중간에 숫자 있어서) | 전체 검사: /^[0-9]+$/ 처럼 ^ $ 추가 |
| 구분자 문자가 패턴에 포함 | /http://example/ — / 때문에 오류 | 다른 구분자 사용: #http://example# 또는 이스케이프 |
| i 플래그 없는 대소문자 비교 | /^[a-z]+$/ → "Hello" 불일치 | /^[a-z]+$/i 로 대소문자 무관 검사 |
| 이메일 검증에 정규식만 사용 | RFC 5321 표준에 맞지 않는 주소 통과 | filter_var($email, FILTER_VALIDATE_EMAIL) 병행 사용 |
핵심 한 줄 요약
preg_match($pattern, $str)정규식 패턴 매칭 — 1(일치)/0(불일치)/false(오류)
^ $전체 문자열 검사의 핵심 — 없으면 부분 매치로 검증 허점 생김
$matches세 번째 인수 — [0]=전체, [1]부터=괄호 캡처 그룹
preg_match_all모든 일치 항목 배열로 — 단건 검사는 preg_match
preg_replace검사가 아닌 치환 — 패턴 매치 후 문자열 변환
Tags
#PHP #preg_match #정규식 #정규표현식 #패턴매칭 #입력검증 #preg_replace #PHP문자열함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, preg_match, 정규식, 정규표현식, 패턴매칭, 입력검증, preg_replace, PHP문자열함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP TEXTAREA + nl2br() — 장문 입력 완전 정리 (0) | 2026.07.11 |
|---|---|
| PHP POST 폼 기초 — form + view 완전 정리 (0) | 2026.07.11 |
| PHP header(Location) — 페이지 리다이렉션 · exit 필수 · 301/302 완전 정리 (0) | 2026.07.11 |
| PHP mb_convert_encoding() — 인코딩 변환 · UTF-8 · EUC-KR 완전 정리 (0) | 2026.07.11 |
| PHP pathinfo() — 경로 정보 분해 · dirname · basename · extension 완전 정리 (0) | 2026.07.11 |
왕진 블로그

댓글