고급 PHP 프로그래밍 – 정규 표현식 – 1 – 패턴 매칭과 치환

고급 PHP 프로그래밍 - 정규 표현식 - 1 - 패턴 매칭과 치환
고급 PHP 프로그래밍 – 정규 표현식 – 1 – 패턴 매칭과 치환

고급 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 코딩 되세요! 💻✨

답글 남기기