
고급 PHP 프로그래밍 – 정규 표현식 – 패턴 매칭과 치환
안녕하세요! 😊
이전 시간에는 정규 표현식의 기본 문법에 대해 살펴봤죠?
이번에는 본격적으로 정규 표현식을 PHP 코드에 어떻게 활용할 수 있는지,
특히 패턴 매칭과 문자열 치환 기능을 중심으로 다뤄볼게요!
정규 표현식은 마치 문자열을 찾아내는 탐정 같아요.
찾아야 할 단서(패턴)를 알려주면, 문장 속에서 정확히 집어내고, 필요하면 바꿔주기까지 하죠! 🕵️♀️
1. 정규 표현식으로 패턴 매칭하기: preg_match()
✅ 기본 사용법
preg_match(정규표현식, 문자열, 결과배열);
- 정규표현식:
/패턴/
형태 - 문자열: 검사 대상
- 결과배열(선택): 패턴에 일치한 부분이 저장됨
🧪 예제 1: 이메일 주소인지 확인
$email = "user@example.com";
if (preg_match("/^[\w\-\.]+@([\w\-]+\.)+[a-zA-Z]{2,7}$/", $email)) {
echo "✅ 이메일 주소 형식입니다.";
} else {
echo "❌ 올바르지 않은 이메일 주소입니다.";
}
🧪 예제 2: 문자열 안에서 특정 단어 찾기
$text = "PHP is fun and powerful.";
if (preg_match("/fun/", $text)) {
echo "🎯 'fun'이라는 단어가 포함되어 있어요!";
}
🧪 예제 3: 매칭된 부분 추출하기
$text = "내 전화번호는 010-1234-5678입니다.";
if (preg_match("/\d{3}-\d{3,4}-\d{4}/", $text, $matches)) {
echo "📞 찾은 번호: " . $matches[0];
}
$matches[0]
: 첫 번째로 찾은 전체 일치 결과
2. 모든 일치 항목 찾기: preg_match_all()
preg_match()
는 첫 번째 항목만 찾지만,
preg_match_all()
은 모든 일치 항목을 배열로 추출합니다!
🧪 예제 4: 글 속 모든 이메일 추출
$text = "문의는 contact@company.com 또는 help@support.io 로 주세요.";
preg_match_all("/[\w\.-]+@[\w\.-]+\.[a-zA-Z]{2,7}/", $text, $matches);
print_r($matches[0]);
결과:
Array
(
[0] => contact@company.com
[1] => help@support.io
)
3. 정규 표현식으로 문자열 치환하기: preg_replace()
✅ 기본 사용법
preg_replace(정규표현식, 바꿀문자열, 대상문자열);
🧪 예제 5: 전화번호 형식 숨기기
$tel = "010-1234-5678";
echo preg_replace("/\d{3}-\d{3,4}-\d{4}/", "☎️ 비공개", $tel);
→ 결과: ☎️ 비공개
🧪 예제 6: 금지어 마스킹 처리
$comment = "이건 진짜 욕설이야 바보 멍청이!";
$badwords = "/바보|멍청이|욕설/";
$clean = preg_replace($badwords, "****", $comment);
echo $clean;
→ 결과: 이건 진짜 ****이야 **** ****!
🧪 예제 7: HTML 태그 제거하기
$html = "<p>안녕하세요 <b>홍길동</b>입니다.</p>";
$plain = preg_replace("/<[^>]*>/", "", $html);
echo $plain; // 안녕하세요 홍길동입니다.
4. 콜백을 활용한 고급 치환: preg_replace_callback()
단순 치환이 아니라, 일치한 문자열을 조건에 따라 가공하고 싶을 때 사용합니다!
🧪 예제 8: 숫자에 10% 세금 추가
$text = "상품 가격은 10000원, 배송비는 2500원입니다.";
$newText = preg_replace_callback(
"/\d+/", // 숫자 찾기
function($matches) {
$num = (int)$matches[0];
return round($num * 1.1); // 10% 추가
},
$text
);
echo $newText;
// 상품 가격은 11000원, 배송비는 2750원입니다.
5. 문자열 분리: preg_split()
정규 표현식을 기준으로 문자열을 나눌 수 있어요!
🧪 예제 9: 쉼표나 공백으로 분리하기
$str = "사과, 바나나 포도,복숭아 수박";
$fruits = preg_split("/[,\s]+/", $str);
print_r($fruits);
→ 결과:
Array
(
[0] => 사과
[1] => 바나나
[2] => 포도
[3] => 복숭아
[4] => 수박
)
🔍 정규 표현식 플래그 옵션
옵션 | 의미 |
---|---|
i |
대소문자 무시 |
m |
여러 줄 인식 (^ , $ 가 각 줄의 처음/끝에 적용) |
u |
유니코드 처리 |
s |
줄바꿈 문자 포함 . 처리 가능 |
preg_match("/hello/i", "HeLLo"); // true
✅ 정리 – 어떤 함수를 언제 사용할까?
함수 | 기능 | 용도 |
---|---|---|
preg_match() |
첫 번째 일치 항목 찾기 | 유효성 검사, 패턴 확인 |
preg_match_all() |
모든 일치 항목 배열로 반환 | 대량 추출 |
preg_replace() |
일치 부분을 다른 문자열로 바꿈 | 마스킹, 형식 변경 |
preg_replace_callback() |
콜백 함수로 동적 치환 | 계산, 가공 |
preg_split() |
정규식 기준 문자열 나누기 | 구분자 다양할 때 분리 |
❗ 주의해야 할 점 요약
항목 | 주의할 점 |
---|---|
구분자 | /패턴/ 의 / 외에도 # , ~ 등 가능 (충돌 방지용) |
특수문자 이스케이프 | . , * , ? , + , ( , ) 등은 \ 로 이스케이프 |
한글 대응 | 유니코드 플래그 u 필요 (/패턴/u ) |
성능 이슈 | 너무 복잡한 정규식은 서버 부하를 줄 수 있어요! |
잘못된 치환 | preg_replace() 는 무분별한 치환에 주의해야 해요 (예: 이메일 주소 손상) |
마무리하며 😊
정규 표현식은 단순히 문자열을 찾는 데 그치지 않고,
유효성 검사, 텍스트 클렌징, 데이터 마이닝 등 정말 다양한 분야에 활용됩니다!
처음에는 어려워 보일 수 있지만, 예제를 통해 자주 연습하다 보면 어느새 문자열 마법사가 되어 있을 거예요! 🧙♂️
다음 시간에는 정규 표현식 함수의 심화 활용법과 성능 최적화 팁까지 알려드릴게요!
지금까지 멋지게 따라와 주셔서 감사합니다.
오늘도 뿌듯한 PHP 코딩 되세요! 💻✨