본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP preg_match() — 정규식 패턴 매칭 · 입력 검증 · 그룹 캡처 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

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학습, 웹개발, 티스토리
반응형

댓글