💻 자주 쓰는 PHP 함수

[PHP 함수] preg_match() 함수로 패턴 검사하기

rhandy 2025. 3. 26. 17:57
728x90

PHP에서 문자열을 다룰 때, 특정 패턴을 검사해야 하는 경우가 많습니다.
예를 들어, 이메일 주소 유효성 검사, 전화번호 형식 확인, 특정 단어 포함 여부 검사 등에서 정규 표현식(Regex)을 활용하면 강력한 패턴 매칭이 가능합니다.

이러한 기능을 수행하는 대표적인 함수가 바로 preg_match() 입니다.

이 글에서는 PHP preg_match() 함수의 사용법, 다양한 활용 예제, preg_match_all()과의 차이점, 유용한 팁과 주의사항을 체계적으로 정리하겠습니다. 


1. preg_match() 함수란?

기본 문법

int preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0)

매개변수 설명

매개변수 설명

$pattern 검색할 정규 표현식 (슬래시 /로 감싸야 함)
$subject 검사할 문자열
$matches (선택) 매칭된 결과를 저장할 배열
$flags (선택) 검색 동작을 변경하는 옵션
$offset (선택) 검색을 시작할 위치 (기본값 0)

반환값

  • 패턴이 문자열에서 일치하면 1 반환
  • 일치하지 않으면 0 반환
  • 오류 발생 시 false 반환

2. preg_match() 기본 예제

🔹 단순 패턴 매칭

<?php
$text = "Hello, PHP!";
if (preg_match("/PHP/", $text)) {
    echo "✅ 'PHP'가 포함되어 있습니다.";
} else {
    echo "❌ 'PHP'가 포함되어 있지 않습니다.";
}
?>

🔹 실행 결과

✅ 'PHP'가 포함되어 있습니다.

➡ 문자열 "Hello, PHP!"에서 "PHP"가 존재하므로 1을 반환.


🔹 매칭된 문자열을 $matches 배열에 저장

<?php
$text = "My email is example@email.com";
preg_match("/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}/i", $text, $matches);
print_r($matches);
?>

🔹 실행 결과

Array
(
    [0] => example@email.com
)

➡ 이메일 주소가 정규 표현식과 일치하여 $matches[0]에 저장됨.


3. preg_match()의 실용적인 활용 예제

🔹 1) 이메일 유효성 검사

<?php
$email = "test@example.com";

if (preg_match("/^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i", $email)) {
    echo "✅ 올바른 이메일 형식입니다.";
} else {
    echo "❌ 잘못된 이메일 형식입니다.";
}
?>

➡ 이메일 형식을 검증하여 올바른지 확인 가능.


🔹 2) 전화번호 형식 검사

<?php
$phone = "010-1234-5678";

if (preg_match("/^01[0-9]-\d{3,4}-\d{4}$/", $phone)) {
    echo "✅ 올바른 전화번호 형식입니다.";
} else {
    echo "❌ 잘못된 전화번호 형식입니다.";
}
?>

➡ "010-1234-5678"과 같은 형식만 허용.


🔹 3) 비밀번호 강도 검사 (영문, 숫자 포함 8자 이상)

<?php
$password = "Secure123";

if (preg_match("/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/", $password)) {
    echo "✅ 안전한 비밀번호입니다.";
} else {
    echo "❌ 비밀번호는 최소 8자 이상이며, 숫자와 영문을 포함해야 합니다.";
}
?>

➡ 비밀번호가 최소 8자 이상, 영문과 숫자를 포함해야 통과.


🔹 4) 특정 단어 포함 여부 확인

<?php
$text = "오늘 날씨가 정말 좋네요!";

if (preg_match("/날씨/", $text)) {
    echo "✅ '날씨'라는 단어가 포함되어 있습니다.";
} else {
    echo "❌ '날씨'라는 단어가 포함되어 있지 않습니다.";
}
?>

➡ "날씨"라는 단어가 포함된 경우 true 반환.


🔹 5) HTML 태그 제거

<?php
$html = "<p>Hello, <b>PHP</b>!</p>";
$cleanText = preg_replace("/<[^>]*>/", "", $html);
echo $cleanText;
?>

🔹 실행 결과

Hello, PHP!

➡ HTML 태그를 제거하고 순수한 텍스트만 출력.


4. preg_match() vs preg_match_all() 차이점

함수 설명

preg_match() 첫 번째 일치 항목만 반환
preg_match_all() 모든 일치 항목을 배열로 반환

예제: preg_match() vs preg_match_all()

<?php
$text = "apple banana apple grape apple";
preg_match("/apple/", $text, $match);
preg_match_all("/apple/", $text, $matches);

print_r($match);
print_r($matches);
?>

🔹 실행 결과

Array
(
    [0] => apple
)

Array
(
    [0] => Array
        (
            [0] => apple
            [1] => apple
            [2] => apple
        )
)

➡ preg_match()는 첫 번째 apple만 반환,
➡ preg_match_all()은 모든 apple을 배열로 반환.


5. preg_match() 사용 시 주의할 점

정규 표현식 패턴을 /로 감싸야 함

<?php
preg_match("/PHP/", "Hello PHP"); // 올바른 패턴
preg_match("PHP", "Hello PHP"); // 오류 발생!
?>

➡ 정규식은 반드시 슬래시(/)로 감싸야 함.

대소문자 구분 (i 플래그 사용)

<?php
preg_match("/php/", "Hello PHP", $match); // false (대소문자 구분)
preg_match("/php/i", "Hello PHP", $match); // true (대소문자 무시)
?>

➡ /i 플래그를 사용하면 대소문자 구분 없이 검색 가능.

false 반환 시 preg_last_error()로 오류 확인

<?php
if (preg_match("/(php/", "Hello PHP") === false) {
    echo "오류 발생: " . preg_last_error();
}
?>

➡ 정규식 오류 발생 시 preg_last_error()를 사용하여 원인 확인 가능.

배열을 대상으로 검색할 경우 foreach 사용

<?php
$data = ["Hello PHP", "Welcome to PHP", "JavaScript"];

foreach ($data as $text) {
    if (preg_match("/PHP/i", $text)) {
        echo "✅ '$text'에서 'PHP' 발견!\n";
    }
}
?>

배열 내 문자열을 검색하려면 foreach 사용.


6. 결론

PHP의 preg_match() 함수는 정규 표현식을 활용하여 문자열을 검사하는 강력한 함수입니다.
이를 활용하면 이메일 검증, 비밀번호 강도 검사, 특정 단어 검색, HTML 태그 제거 등 다양한 작업을 수행할 수 있습니다.

📌 핵심 요약
✔️ preg_match()는 첫 번째 매칭된 결과만 반환
✔️ 모든 매칭을 찾으려면 preg_match_all() 사용
✔️ 대소문자 구분 없이 검색하려면 /i 플래그 사용
✔️ 정규 표현식 오류 발생 시 preg_last_error()로 확인

이제 preg_match()를 활용하여 더욱 정밀한 PHP 개발을 해보세요! 🚀

💡 도움이 되셨다면 공유해주세요! 😊

728x90