
고급 PHP 프로그래밍 – 정규 표현식 문법
안녕하세요! 😊
이번 시간에는 PHP에서 굉장히 강력한 도구인 **정규 표현식(Regular Expression)**의 문법에 대해 자세히 알아보겠습니다.
정규 표현식은 문자나 문자열을 특정한 패턴으로 검색하거나 대체할 수 있는 도구로, 마치 문자들 사이를 날렵하게 헤엄치는 탐색견 같다고 볼 수 있어요 🐶
이 도구를 잘 다루면, 이메일 주소 검사부터 로그 분석, 문자열 필터링, 대용량 텍스트 처리까지 정말 다양하게 활용할 수 있답니다!
정규 표현식이란?
정규 표현식(Regular Expression, 줄여서 regex 또는 regexp)은
특정한 규칙을 가진 문자열의 집합을 정의하는 표현 방법입니다.
간단한 예시:
preg_match("/cat/", "I have a cat."); // "cat"이 존재하므로 true
정규 표현식은 단순 문자열 비교가 아니라, 패턴을 기반으로 문자열을 유연하게 탐색할 수 있어요!
PHP에서 정규 표현식을 사용하는 함수들
함수명 | 설명 |
---|---|
preg_match() |
문자열에서 패턴이 일치하는지 확인 |
preg_match_all() |
문자열에서 모든 일치 항목 찾기 |
preg_replace() |
일치하는 부분을 치환 |
preg_split() |
패턴 기준으로 문자열 분리 |
정규 표현식 문법 기본
✅ 1. 리터럴 문자
그냥 평범한 문자들은 있는 그대로 매칭합니다.
preg_match("/dog/", "hotdog"); // true
✅ 2. 특수 문자
정규 표현식에서는 특별한 의미를 가지는 문자가 있어요.
문자 | 의미 | |
---|---|---|
. |
임의의 한 문자 | |
^ |
문자열의 시작 | |
$ |
문자열의 끝 | |
* |
앞 문자가 0번 이상 반복 | |
+ |
앞 문자가 1번 이상 반복 | |
? |
앞 문자가 0 또는 1번 나옴 | |
[] |
문자 클래스, 대괄호 안의 문자 중 하나 | |
` | ` | OR 조건 | |
() |
그룹화 | |
\ |
이스케이프 문자 (특수문자 무력화) |
✅ 3. 문자 클래스 []
[abc]
: a, b, c 중 하나[a-z]
: 소문자 a부터 z까지[0-9]
: 숫자 0부터 9까지
preg_match("/[A-Z]/", "Hello"); // 대문자 'H'가 있으므로 true
✅ 4. 수량자
표현식 | 의미 | 예시 |
---|---|---|
a* |
a가 0번 이상 | “”, “a”, “aaa” 모두 매칭 |
a+ |
a가 1번 이상 | “a”, “aa”는 매칭, “”은 아님 |
a? |
a가 0 또는 1번 | “”, “a”는 매칭 |
a{3} |
a가 정확히 3번 | “aaa”만 매칭 |
a{2,} |
a가 2번 이상 | “aa”, “aaa”, … |
a{2,4} |
a가 2~4번 | “aa”, “aaa”, “aaaa” 매칭 |
✅ 5. 앵커(Anchor)
표현 | 설명 |
---|---|
^ |
문자열 시작 |
$ |
문자열 끝 |
preg_match("/^hello/", "hello world"); // true
preg_match("/world$/", "hello world"); // true
✅ 6. 그룹과 선택
기호 | 의미 | |
---|---|---|
() |
그룹 지정 | |
` | ` | OR 조건 |
preg_match("/(cat|dog)/", "I love dogs"); // true
✅ 7. 이스케이프 문자 \
특수문자를 문자 그대로 인식시키기 위해 사용합니다.
preg_match("/\./", "file.txt"); // 점(.) 문자 찾기
정규 표현식 실전 예제
📧 이메일 주소 검사
$email = "hello@example.com";
if (preg_match("/^[\w\-\.]+@([\w\-]+\.)+[a-zA-Z]{2,7}$/", $email)) {
echo "올바른 이메일입니다!";
}
📞 전화번호 형식 검사
$tel = "010-1234-5678";
if (preg_match("/^01[0|1|6|7|8|9]-\d{3,4}-\d{4}$/", $tel)) {
echo "전화번호 형식이 맞습니다!";
}
🔐 비밀번호 강도 검사 (영문+숫자+특수문자, 8자 이상)
$password = "abc123@!";
if (preg_match("/^(?=.*[A-Za-z])(?=.*\d)(?=.*[\W_]).{8,}$/", $password)) {
echo "강력한 비밀번호입니다!";
}
주의해야 할 점
항목 | 주의사항 |
---|---|
구분자 | / 외에도 # , ~ 등도 가능하지만 시작과 끝이 맞아야 해요. |
특수문자 처리 | . * + 등은 꼭 \ 로 이스케이프 해야 문자 그대로 인식됩니다. |
다국어 처리 | 유니코드를 사용할 때는 u 플래그 추가 (/패턴/u ) |
성능 | 너무 복잡한 정규식은 성능 저하 원인이 될 수 있으니 꼭 테스트하세요! |
마무리하며 😊
정규 표현식은 익숙해지면 정말 강력한 도구예요!
초반에는 기호가 많고 생소해서 어렵게 느껴질 수 있지만,
하나하나 연습하다 보면 “어? 이거 내가 만들었네?” 하는 날이 올 거예요.
다음 시간에는 정규 표현식을 활용해 문자열을 매칭하고 치환하는 실전 코드를 자세히 알아볼게요!
궁금한 패턴이 있다면 언제든 질문 주세요~
정규 표현식의 세계로 한 발 더 나아가 볼까요? 🧙♂️💻