📖
PHP preg_match() 함수 – 개념 정리 및 사용 예제
페이지 정보
본문
preg_match() 함수의 사용법
preg_match() 함수는
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾아내는 함수입니다.
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이메일 주소, 전화번호, URL과 같은 특정 패턴의 문자열을 검사할 때 주로 사용되며,
문자열에서 특정 패턴을 검색하거나 문자열에서 특정 형식의 데이터를 추출하는 데에도 사용됩니다.[code]$email = "codingeverybody@example.com";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo '이메일 주소가 올바른 형식입니다.';
} else {
echo '이메일 주소가 올바른 형식이 아닙니다.';
}
// 출력: '이메일 주소가 올바른 형식입니다.'[/code]
문자열 내에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 바꾸려면 preg_replace() 함수를 사용하세요.
preg_match() 함수의 형식은 다음과 같습니다.[code]preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false
/* preg_match(
정규식 패턴,
검색 대상이 되는 문자열,
일치하는 부분을 저장할 배열[,
추가적인 설정을 지정하는 플래그[,
검색을 시작할 문자열 내의 오프셋]]
);
*/[/code]
매개변수
$pattern -> 필수. 검색할 정규 표현식 패턴입니다.
$subject -> 필수. 검색 대상이 되는 문자열입니다.
$matches -> 필수. 정규 표현식 패턴에 일치하는 결과를 저장할 배열입니다.
이 배열은 함수 호출 후에 채워집니다. 참조 변수입니다.
$matches 배열은 함수가 실행된 후에 일치하는 부분 문자열들로 채워집니다.
$matches[0]: 정규 표현식 전체에 일치하는 문자열입니다.
$matches[1], $matches[2], 기타 등등: 정규 표현식에서 괄호로 묶인 그룹에 일치하는 문자열입니다. (만약 패턴에 그룹이 없다면 이러한 인덱스는 존재하지 않습니다.)
$flags -> 옵션. 추가적인 설정을 지정하는 플래그입니다.
다음과 같은 플래그를 사용할 수 있습니다.
PREG_OFFSET_CAPTURE: 이 플래그를 사용하면 $matches 배열에 일치하는 문자열의 시작 위치가 포함된 두 번째 차원 배열이 포함됩니다. 예를 들어, $matches[0]는 일치하는 문자열을, $matches[0][1]은 시작 위치를 나타냅니다.
PREG_UNMATCHED_AS_NULL: 이 플래그를 사용하면 정규 표현식의 일치하지 않은 하위 패턴(subpattern)은 null로 보고됩니다. 이 플래그를 사용하지 않으면 일치하지 않은 하위 패턴은 빈 문자열로 보고됩니다.
$offset -> 옵션. 검색을 시작할 문자열 내의 오프셋입니다. 0부터 시작합니다.
반환 값
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이 함수와 유사한 preg_match_all() 함수는 주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치하는 모든 부분(match all)을 찾는 함수입니다.
예제
preg_match() 함수의 유용한 예제입니다.
숫자 추출[code]$text = '가격이 500원입니다.';
$pattern = "/\d+/";
if (preg_match($pattern, $text, $matches)) {
echo '찾은 숫자: ' . $matches[0];
} else {
echo '숫자를 찾을 수 없습니다.';
}
// 출력: '찾은 숫자: 500'[/code]
URL에서 도메인 추출[code]$url = 'https://www.example.com/page';
$pattern = "/https:\/\/(www\.)?([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,6})\/([a-zA-Z0-9.-\/]*)/";
if (preg_match($pattern, $url, $matches)) {
$domain = $matches[2];
echo '추출된 도메인: ' . $domain;
} else {
echo '도메인을 찾을 수 없습니다.';
}
// 출력: '추출된 도메인: example'[/code]
전화번호 추출[code]$text = '문자열에서 전화번호는 010-1234-5678과 같이 나타날 수 있습니다.';
$pattern = "/\b(?:\d{2,3}[-.])?\d{3,4}[-.]\d{4}\b/";
if (preg_match($pattern, $text, $matches)) {
$phoneNumber = $matches[0];
echo '추출된 전화번호: ' . $phoneNumber;
} else {
echo '전화번호를 찾을 수 없습니다.';
}
// 출력: '추출된 전화번호: 010-1234-5678'[/code]
주의할 점
정규 표현식이 올바른지 확인해야 합니다. 잘못된 정규 표현식을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
기본적으로 preg_match() 함수는 대소문자를 구분합니다. 만약 대소문자를 구분하지 않고 싶다면 정규 표현식에 /i 플래그를 추가하세요.[code]$text = 'Hello, World!';
$pattern = "/hello/i";
if (preg_match($pattern, $text, $matches)) {
echo '대소문자 구분 없이 일치하는 문자열을 찾았습니다: ' . $matches[0];
} else {
echo '일치하는 문자열을 찾을 수 없습니다.';
}
// 출력: '대소문자 구분 없이 일치하는 문자열을 찾았습니다: Hello';[/code]
하나의 문자열이 다른 문자열에 포함되어 있는지만 확인하려면 이 함수보다 더 빠르게 수행하는 strpos() 함수를 사용하는 것이 좋습니다. strpos() 함수는 간단하고 빠르게 작동하며, 문자열의 포함 여부를 확인하는 간단한 작업에 적합합니다.[code]$str = 'Hello, World!';
$substring = 'Hello';
$pos = strpos($str, $substring);
if ($pos === false) {
echo "문자열에 'Hello'를 찾을 수 없습니다.";
} else {
echo "문자열에 'Hello'가 포함되어 있습니다.";
}
// 출력: "문자열에 'Hello'가 포함되어 있습니다."[/code]
조건문reg_match() 함수의 사용법
preg_match() 함수는
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾아내는 함수입니다.
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이메일 주소, 전화번호, URL과 같은 특정 패턴의 문자열을 검사할 때 주로 사용되며,
문자열에서 특정 패턴을 검색하거나 문자열에서 특정 형식의 데이터를 추출하는 데에도 사용됩니다.[code]$email = "codingeverybody@example.com";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo '이메일 주소가 올바른 형식입니다.';
} else {
echo '이메일 주소가 올바른 형식이 아닙니다.';
}
// 출력: '이메일 주소가 올바른 형식입니다.'[/code]
문자열 내에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 바꾸려면 preg_replace() 함수를 사용하세요.
preg_match() 함수의 형식은 다음과 같습니다.[code]preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false
/* preg_match(
정규식 패턴,
검색 대상이 되는 문자열,
일치하는 부분을 저장할 배열[,
추가적인 설정을 지정하는 플래그[,
검색을 시작할 문자열 내의 오프셋]]
);
*/[/code]
매개변수
$pattern -> 필수. 검색할 정규 표현식 패턴입니다.
$subject -> 필수. 검색 대상이 되는 문자열입니다.
$matches -> 필수. 정규 표현식 패턴에 일치하는 결과를 저장할 배열입니다.
이 배열은 함수 호출 후에 채워집니다. 참조 변수입니다.
$matches 배열은 함수가 실행된 후에 일치하는 부분 문자열들로 채워집니다.
$matches[0]: 정규 표현식 전체에 일치하는 문자열입니다.
$matches[1], $matches[2], 기타 등등: 정규 표현식에서 괄호로 묶인 그룹에 일치하는 문자열입니다. (만약 패턴에 그룹이 없다면 이러한 인덱스는 존재하지 않습니다.)
$flags -> 옵션. 추가적인 설정을 지정하는 플래그입니다.
다음과 같은 플래그를 사용할 수 있습니다.
PREG_OFFSET_CAPTURE: 이 플래그를 사용하면 $matches 배열에 일치하는 문자열의 시작 위치가 포함된 두 번째 차원 배열이 포함됩니다. 예를 들어, $matches[0]는 일치하는 문자열을, $matches[0][1]은 시작 위치를 나타냅니다.
PREG_UNMATCHED_AS_NULL: 이 플래그를 사용하면 정규 표현식의 일치하지 않은 하위 패턴(subpattern)은 null로 보고됩니다. 이 플래그를 사용하지 않으면 일치하지 않은 하위 패턴은 빈 문자열로 보고됩니다.
$offset -> 옵션. 검색을 시작할 문자열 내의 오프셋입니다. 0부터 시작합니다.
반환 값
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이 함수와 유사한 preg_match_all() 함수는 주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치하는 모든 부분(match all)을 찾는 함수입니다.
예제
preg_match() 함수의 유용한 예제입니다.
숫자 추출[code]$text = '가격이 500원입니다.';
$pattern = "/\d+/";
if (preg_match($pattern, $text, $matches)) {
echo '찾은 숫자: ' . $matches[0];
} else {
echo '숫자를 찾을 수 없습니다.';
}
// 출력: '찾은 숫자: 500'[/code]
URL에서 도메인 추출[code]$url = 'https://www.example.com/page';
$pattern = "/https:\/\/(www\.)?([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,6})\/([a-zA-Z0-9.-\/]*)/";
if (preg_match($pattern, $url, $matches)) {
$domain = $matches[2];
echo '추출된 도메인: ' . $domain;
} else {
echo '도메인을 찾을 수 없습니다.';
}
// 출력: '추출된 도메인: example'[/code]
전화번호 추출[code]$text = '문자열에서 전화번호는 010-1234-5678과 같이 나타날 수 있습니다.';
$pattern = "/\b(?:\d{2,3}[-.])?\d{3,4}[-.]\d{4}\b/";
if (preg_match($pattern, $text, $matches)) {
$phoneNumber = $matches[0];
echo '추출된 전화번호: ' . $phoneNumber;
} else {
echo '전화번호를 찾을 수 없습니다.';
}
// 출력: '추출된 전화번호: 010-1234-5678'[/code]
주의할 점
정규 표현식이 올바른지 확인해야 합니다. 잘못된 정규 표현식을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
기본적으로 preg_match() 함수는 대소문자를 구분합니다. 만약 대소문자를 구분하지 않고 싶다면 정규 표현식에 /i 플래그를 추가하세요.[code]$text = 'Hello, World!';
$pattern = "/hello/i";
if (preg_match($pattern, $text, $matches)) {
echo '대소문자 구분 없이 일치하는 문자열을 찾았습니다: ' . $matches[0];
} else {
echo '일치하는 문자열을 찾을 수 없습니다.';
}
// 출력: '대소문자 구분 없이 일치하는 문자열을 찾았습니다: Hello';[/code]
하나의 문자열이 다른 문자열에 포함되어 있는지만 확인하려면 이 함수보다 더 빠르게 수행하는 strpos() 함수를 사용하는 것이 좋습니다. strpos() 함수는 간단하고 빠르게 작동하며, 문자열의 포함 여부를 확인하는 간단한 작업에 적합합니다.[code]$str = 'Hello, World!';
$substring = 'Hello';
$pos = strpos($str, $substring);
if ($pos === false) {
echo "문자열에 'Hello'를 찾을 수 없습니다.";
} else {
echo "문자열에 'Hello'가 포함되어 있습니다.";
}
// 출력: "문자열에 'Hello'가 포함되어 있습니다."[/code]
💊조건문
1번 코드[code]if($list[$i]['wr_2'] == 2 || preg_match('/세로직캠/', $clean_subject) || preg_match('/세로영상/', $clean_subject) || preg_match('/세로버전/', $clean_subject)){
...
}[/code]preg_match()를 3번 각각 호출합니다.
"세로직캠", "세로영상", "세로버전"을 개별적으로 검사합니다.
매번 정규식을 새로 파싱하고 검사하므로, 약간의 오버헤드가 생깁니다.
2번 코드[code]if($list[$i]['wr_2'] == 2 || preg_match('/세로직캠|세로영상|세로버전/', $clean_subject)){
...
}[/code]preg_match()를 한 번만 호출합니다.
정규식에 |(or)을 써서 세 가지 키워드 중 하나라도 매칭되면 true.
조금 더 빠르고, 코드도 깔끔합니다.
요약
기능상 거의 차이 없습니다. (결과는 같아요.)
다만, 2번 코드가 더 효율적이고 깔끔합니다.
특히 대상이 많아지면 (10개, 20개 키워드) 2번 방식이 훨씬 유리합니다.
만약 키워드가 많아질 것 같으면 아예 배열로 관리하고 루프를 돌리는 것도 좋아요.
예를 들면:[code]$keywords = ['세로직캠', '세로영상', '세로버전'];
if ($list[$i]['wr_2'] == 2 || preg_match('/'.implode('|', $keywords).'/', $clean_subject)) {
// 처리
}[/code]이렇게 하면 키워드 추가도 간단합니다.
키워드가 많아질 거라면, 무조건 깔끔하고 관리하기 쉬운 형태로 가야 합니다.
예를 들어, 이렇게 정리할 수 있어요[code]$keywords = ['세로직캠', '세로영상', '세로버전', '세로콘서트', '세로팬캠', '직캠모음', '팬미팅세로', /* 추가 계속 */];
$pattern = '/'.implode('|', array_map('preg_quote', $keywords)).'/';
if ($list[$i]['wr_2'] == 2 || preg_match($pattern, $clean_subject)) {
// 여기에 해당하는 코드 실행
}[/code]여기서 포인트는:
preg_quote()를 써서 키워드 안에 특수문자(예: ., *, ?)가 있어도 안전하게 escape 처리합니다.
implode('|', ...)로 자동으로 |로 연결해줍니다.
키워드를 배열로 관리하니까 나중에 추가/삭제가 엄청 편합니다.
만약 키워드가 정확히 일치해야 한다면, 패턴을 이렇게 더 엄격하게 만들 수도 있어요[code]$pattern = '/(' . implode('|', array_map('preg_quote', $keywords)) . ')/u';[/code]u 플래그를 붙이면 UTF-8 한글도 제대로 처리합니다.
필요하면 단어 경계(\b)를 넣을 수도 있어요.
요약하면:
키워드 많으면 → 배열
preg_match()는 한 번만 호출
preg_quote() 꼭 써주기
이걸 더 함수화해서 초간단 호출하게 만들수도 있어요[code]<?php
// 키워드 배열
$keywords = ['세로직캠', '세로영상', '세로버전', '세로콘서트', '세로팬캠', '직캠모음', '팬미팅세로'];
/**
* 문자열 안에 키워드 배열 중 하나라도 포함되어 있는지 검사하는 함수
*
* @param string $subject 검사할 문자열
* @param array $keywords 키워드 배열
* @return bool 매칭되면 true, 없으면 false
*/
function match_keywords($subject, array $keywords): bool {
if (empty($keywords)) {
return false; // 키워드가 비어있으면 매칭 없음
}
// 키워드를 안전하게 escape 처리하고 | 로 연결
$pattern = '/(' . implode('|', array_map('preg_quote', $keywords)) . ')/u';
return preg_match($pattern, $subject) === 1;
}
// 사용 예시
if ($list[$i]['wr_2'] == 2 || match_keywords($clean_subject, $keywords)) {
// 여기에 해당하는 코드 실행
}
?>
[/code]
설명
match_keywords($clean_subject, $keywords) → 이 한 줄로 간단하게 검사 가능!
키워드 추가는 $keywords 배열에만 추가하면 끝.
preg_quote()로 특수문자 안전하게 처리.
/u 플래그로 한글 문제 없이 매칭.
참고 예시[code]$clean_subject = '오늘 세로영상 올라왔어요!';
if (match_keywords($clean_subject, $keywords)) {
echo '키워드에 매칭되었습니다!';
} else {
echo '매칭된 키워드가 없습니다.';
}[/code]👉 결과: 키워드에 매칭되었습니다!
지금부터 match_keywords()를 확장해서
👉 다양한 옵션까지 지원하는 "완전체 버전"을 만들어 보겠습니다.[code]<?php
/**
* 문자열 안에 키워드 배열 중 하나라도 포함되어 있는지 검사하는 슈퍼 함수
*
* @param string $subject 검사할 문자열
* @param array $keywords 키워드 배열
* @param array $options 옵션 설정 [
* 'case_sensitive' => true|false (대소문자 구분할지),
* 'full_word' => true|false (완전 단어 일치할지),
* ]
* @return bool 매칭되면 true, 없으면 false
*/
function match_keywords(string $subject, array $keywords, array $options = []): bool {
if (empty($keywords)) {
return false;
}
// 옵션 기본값
$case_sensitive = $options['case_sensitive'] ?? true; // 기본은 대소문자 구분
$full_word = $options['full_word'] ?? false; // 기본은 부분 매칭
// 키워드 escape
$escaped_keywords = array_map('preg_quote', $keywords);
// 단어 경계(\b) 추가 (완전 일치 모드일 때)
if ($full_word) {
$pattern = '/\b(' . implode('|', $escaped_keywords) . ')\b/u';
} else {
$pattern = '/(' . implode('|', $escaped_keywords) . ')/u';
}
// 대소문자 무시 옵션
if (!$case_sensitive) {
$pattern .= 'i'; // 패턴 끝에 i 플래그 추가
}
return preg_match($pattern, $subject) === 1;
}
// 사용 예시
$keywords = ['세로직캠', '세로영상', '세로버전', '세로콘서트', '세로팬캠', '직캠모음', '팬미팅세로'];
if ($list[$i]['wr_2'] == 2 || match_keywords($clean_subject, $keywords)) {
// 처리
}
?>
[/code]
✨ 옵션 설명
case_sensitive - 대소문자 구분할지 (true: 구분, false: 무시) - true
full_word - 키워드를 "완전 단어"로만 매칭할지 (\b 사용) - false
📚 사용 예제
1. 기본 사용[code]match_keywords('오늘 세로영상 올렸어요!', $keywords);
// → true[/code]
2. 대소문자 무시[code]match_keywords('오늘 SERO영상 올렸어요!', $keywords, ['case_sensitive' => false]);
// → true (SERO == 세로로 처리)[/code]
3. 단어 완전 일치만 허용[code]match_keywords('팬미팅세로직캠', $keywords, ['full_word' => true]);
// → false (팬미팅세로+직캠은 붙어있어서 단어 단위 아님)[/code]
4. 대소문자 무시 + 완전 단어 매칭[code]match_keywords('SERO콘서트 갔다왔어요', $keywords, ['case_sensitive' => false, 'full_word' => true]);
// → true[/code]
🚀 요약
배열로 키워드를 관리하고
옵션으로 대소문자 무시/단어 완전 매칭까지 자유롭게!
코드도 깔끔하게 정리
🔥매칭된 키워드를 "찾아서 배열로 리턴" 하는
완전판 find_keywords() 함수
🛠 풀버전: find_keywords()[code]<?php
/**
* 문자열 안에 키워드 배열 중 일치하는 키워드를 찾아서 배열로 리턴하는 함수
*
* @param string $subject 검사할 문자열
* @param array $keywords 키워드 배열
* @param array $options 옵션 설정 [
* 'case_sensitive' => true|false (대소문자 구분할지),
* 'full_word' => true|false (완전 단어 일치할지),
* 'return_first' => true|false (처음 매칭 하나만 리턴할지),
* ]
* @return array 매칭된 키워드 배열 (또는 'return_first' 옵션이면 첫 번째 키워드만 배열로 리턴)
*/
function find_keywords(string $subject, array $keywords, array $options = []): array {
if (empty($keywords)) {
return [];
}
$case_sensitive = $options['case_sensitive'] ?? true;
$full_word = $options['full_word'] ?? false;
$return_first = $options['return_first'] ?? false;
$matched = [];
foreach ($keywords as $keyword) {
// 키워드 escape
$escaped = preg_quote($keyword, '/');
// 패턴 설정
$pattern = $full_word ? '/\b' . $escaped . '\b/u' : '/' . $escaped . '/u';
if (!$case_sensitive) {
$pattern .= 'i';
}
if (preg_match($pattern, $subject)) {
$matched[] = $keyword;
if ($return_first) {
break; // 첫 매칭 찾으면 바로 멈춤
}
}
}
return $matched;
}
?>
[/code]
🎯 주요 기능
여러 키워드 중 매칭된 것 모두 배열로 반환
return_first 옵션으로 첫 매칭만 반환 가능
대소문자 무시, 단어 완전 일치도 지원
매칭 결과가 없으면 빈 배열 반환
📚 사용 예제
1. 매칭된 키워드 모두 찾기[code]$keywords = ['세로직캠', '세로영상', '세로버전'];
$result = find_keywords('오늘 세로영상과 세로버전 둘 다 올라왔어요', $keywords);
print_r($result);
// 결과:
// Array ( [0] => 세로영상 [1] => 세로버전 )
[/code]
2. 대소문자 무시하고 찾기[code]$result = find_keywords('SERO영상 세로버전', $keywords, ['case_sensitive' => false]);
print_r($result);
// 결과:
// Array ( [0] => 세로영상 [1] => 세로버전 )[/code]
3. 매칭된 것 중 첫 번째만 반환[code]$result = find_keywords('오늘 세로영상과 세로버전 올라옴', $keywords, ['return_first' => true]);
print_r($result);
// 결과:
// Array ( [0] => 세로영상 )[/code]
4. 단어 경계 정확히 검사[code]$keywords = ['팬', '팬미팅'];
$result = find_keywords('팬미팅 갔다옴', $keywords, ['full_word' => true]);
print_r($result);
// 결과:
// Array ( [0] => 팬미팅 )[/code]※ 팬이 팬미팅 안에 포함되어 있어도, 단어 경계(\b) 때문에 팬만은 따로 잡히지 않습니다.
💬 요약
find_keywords() = 매칭된 키워드들을 배열로 뽑아줌.
옵션 조합해서 진짜 유연하게 사용 가능.
한 줄로 "어떤 키워드가 걸렸는지" 체크하고 "몇 개나 걸렸는지"도 알 수 있음.
preg_match() 함수는
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾아내는 함수입니다.
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이메일 주소, 전화번호, URL과 같은 특정 패턴의 문자열을 검사할 때 주로 사용되며,
문자열에서 특정 패턴을 검색하거나 문자열에서 특정 형식의 데이터를 추출하는 데에도 사용됩니다.[code]$email = "codingeverybody@example.com";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo '이메일 주소가 올바른 형식입니다.';
} else {
echo '이메일 주소가 올바른 형식이 아닙니다.';
}
// 출력: '이메일 주소가 올바른 형식입니다.'[/code]
문자열 내에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 바꾸려면 preg_replace() 함수를 사용하세요.
preg_match() 함수의 형식은 다음과 같습니다.[code]preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false
/* preg_match(
정규식 패턴,
검색 대상이 되는 문자열,
일치하는 부분을 저장할 배열[,
추가적인 설정을 지정하는 플래그[,
검색을 시작할 문자열 내의 오프셋]]
);
*/[/code]
매개변수
$pattern -> 필수. 검색할 정규 표현식 패턴입니다.
$subject -> 필수. 검색 대상이 되는 문자열입니다.
$matches -> 필수. 정규 표현식 패턴에 일치하는 결과를 저장할 배열입니다.
이 배열은 함수 호출 후에 채워집니다. 참조 변수입니다.
$matches 배열은 함수가 실행된 후에 일치하는 부분 문자열들로 채워집니다.
$matches[0]: 정규 표현식 전체에 일치하는 문자열입니다.
$matches[1], $matches[2], 기타 등등: 정규 표현식에서 괄호로 묶인 그룹에 일치하는 문자열입니다. (만약 패턴에 그룹이 없다면 이러한 인덱스는 존재하지 않습니다.)
$flags -> 옵션. 추가적인 설정을 지정하는 플래그입니다.
다음과 같은 플래그를 사용할 수 있습니다.
PREG_OFFSET_CAPTURE: 이 플래그를 사용하면 $matches 배열에 일치하는 문자열의 시작 위치가 포함된 두 번째 차원 배열이 포함됩니다. 예를 들어, $matches[0]는 일치하는 문자열을, $matches[0][1]은 시작 위치를 나타냅니다.
PREG_UNMATCHED_AS_NULL: 이 플래그를 사용하면 정규 표현식의 일치하지 않은 하위 패턴(subpattern)은 null로 보고됩니다. 이 플래그를 사용하지 않으면 일치하지 않은 하위 패턴은 빈 문자열로 보고됩니다.
$offset -> 옵션. 검색을 시작할 문자열 내의 오프셋입니다. 0부터 시작합니다.
반환 값
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이 함수와 유사한 preg_match_all() 함수는 주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치하는 모든 부분(match all)을 찾는 함수입니다.
예제
preg_match() 함수의 유용한 예제입니다.
숫자 추출[code]$text = '가격이 500원입니다.';
$pattern = "/\d+/";
if (preg_match($pattern, $text, $matches)) {
echo '찾은 숫자: ' . $matches[0];
} else {
echo '숫자를 찾을 수 없습니다.';
}
// 출력: '찾은 숫자: 500'[/code]
URL에서 도메인 추출[code]$url = 'https://www.example.com/page';
$pattern = "/https:\/\/(www\.)?([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,6})\/([a-zA-Z0-9.-\/]*)/";
if (preg_match($pattern, $url, $matches)) {
$domain = $matches[2];
echo '추출된 도메인: ' . $domain;
} else {
echo '도메인을 찾을 수 없습니다.';
}
// 출력: '추출된 도메인: example'[/code]
전화번호 추출[code]$text = '문자열에서 전화번호는 010-1234-5678과 같이 나타날 수 있습니다.';
$pattern = "/\b(?:\d{2,3}[-.])?\d{3,4}[-.]\d{4}\b/";
if (preg_match($pattern, $text, $matches)) {
$phoneNumber = $matches[0];
echo '추출된 전화번호: ' . $phoneNumber;
} else {
echo '전화번호를 찾을 수 없습니다.';
}
// 출력: '추출된 전화번호: 010-1234-5678'[/code]
주의할 점
정규 표현식이 올바른지 확인해야 합니다. 잘못된 정규 표현식을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
기본적으로 preg_match() 함수는 대소문자를 구분합니다. 만약 대소문자를 구분하지 않고 싶다면 정규 표현식에 /i 플래그를 추가하세요.[code]$text = 'Hello, World!';
$pattern = "/hello/i";
if (preg_match($pattern, $text, $matches)) {
echo '대소문자 구분 없이 일치하는 문자열을 찾았습니다: ' . $matches[0];
} else {
echo '일치하는 문자열을 찾을 수 없습니다.';
}
// 출력: '대소문자 구분 없이 일치하는 문자열을 찾았습니다: Hello';[/code]
하나의 문자열이 다른 문자열에 포함되어 있는지만 확인하려면 이 함수보다 더 빠르게 수행하는 strpos() 함수를 사용하는 것이 좋습니다. strpos() 함수는 간단하고 빠르게 작동하며, 문자열의 포함 여부를 확인하는 간단한 작업에 적합합니다.[code]$str = 'Hello, World!';
$substring = 'Hello';
$pos = strpos($str, $substring);
if ($pos === false) {
echo "문자열에 'Hello'를 찾을 수 없습니다.";
} else {
echo "문자열에 'Hello'가 포함되어 있습니다.";
}
// 출력: "문자열에 'Hello'가 포함되어 있습니다."[/code]
조건문reg_match() 함수의 사용법
preg_match() 함수는
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾아내는 함수입니다.
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이메일 주소, 전화번호, URL과 같은 특정 패턴의 문자열을 검사할 때 주로 사용되며,
문자열에서 특정 패턴을 검색하거나 문자열에서 특정 형식의 데이터를 추출하는 데에도 사용됩니다.[code]$email = "codingeverybody@example.com";
$pattern = "/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/";
if (preg_match($pattern, $email)) {
echo '이메일 주소가 올바른 형식입니다.';
} else {
echo '이메일 주소가 올바른 형식이 아닙니다.';
}
// 출력: '이메일 주소가 올바른 형식입니다.'[/code]
문자열 내에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 바꾸려면 preg_replace() 함수를 사용하세요.
preg_match() 함수의 형식은 다음과 같습니다.[code]preg_match(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false
/* preg_match(
정규식 패턴,
검색 대상이 되는 문자열,
일치하는 부분을 저장할 배열[,
추가적인 설정을 지정하는 플래그[,
검색을 시작할 문자열 내의 오프셋]]
);
*/[/code]
매개변수
$pattern -> 필수. 검색할 정규 표현식 패턴입니다.
$subject -> 필수. 검색 대상이 되는 문자열입니다.
$matches -> 필수. 정규 표현식 패턴에 일치하는 결과를 저장할 배열입니다.
이 배열은 함수 호출 후에 채워집니다. 참조 변수입니다.
$matches 배열은 함수가 실행된 후에 일치하는 부분 문자열들로 채워집니다.
$matches[0]: 정규 표현식 전체에 일치하는 문자열입니다.
$matches[1], $matches[2], 기타 등등: 정규 표현식에서 괄호로 묶인 그룹에 일치하는 문자열입니다. (만약 패턴에 그룹이 없다면 이러한 인덱스는 존재하지 않습니다.)
$flags -> 옵션. 추가적인 설정을 지정하는 플래그입니다.
다음과 같은 플래그를 사용할 수 있습니다.
PREG_OFFSET_CAPTURE: 이 플래그를 사용하면 $matches 배열에 일치하는 문자열의 시작 위치가 포함된 두 번째 차원 배열이 포함됩니다. 예를 들어, $matches[0]는 일치하는 문자열을, $matches[0][1]은 시작 위치를 나타냅니다.
PREG_UNMATCHED_AS_NULL: 이 플래그를 사용하면 정규 표현식의 일치하지 않은 하위 패턴(subpattern)은 null로 보고됩니다. 이 플래그를 사용하지 않으면 일치하지 않은 하위 패턴은 빈 문자열로 보고됩니다.
$offset -> 옵션. 검색을 시작할 문자열 내의 오프셋입니다. 0부터 시작합니다.
반환 값
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환하고,
일치하는 패턴을 찾지 못하면 0을 반환합니다.
에러가 발생한 경우 false를 반환합니다.
이 함수와 유사한 preg_match_all() 함수는 주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치하는 모든 부분(match all)을 찾는 함수입니다.
예제
preg_match() 함수의 유용한 예제입니다.
숫자 추출[code]$text = '가격이 500원입니다.';
$pattern = "/\d+/";
if (preg_match($pattern, $text, $matches)) {
echo '찾은 숫자: ' . $matches[0];
} else {
echo '숫자를 찾을 수 없습니다.';
}
// 출력: '찾은 숫자: 500'[/code]
URL에서 도메인 추출[code]$url = 'https://www.example.com/page';
$pattern = "/https:\/\/(www\.)?([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,6})\/([a-zA-Z0-9.-\/]*)/";
if (preg_match($pattern, $url, $matches)) {
$domain = $matches[2];
echo '추출된 도메인: ' . $domain;
} else {
echo '도메인을 찾을 수 없습니다.';
}
// 출력: '추출된 도메인: example'[/code]
전화번호 추출[code]$text = '문자열에서 전화번호는 010-1234-5678과 같이 나타날 수 있습니다.';
$pattern = "/\b(?:\d{2,3}[-.])?\d{3,4}[-.]\d{4}\b/";
if (preg_match($pattern, $text, $matches)) {
$phoneNumber = $matches[0];
echo '추출된 전화번호: ' . $phoneNumber;
} else {
echo '전화번호를 찾을 수 없습니다.';
}
// 출력: '추출된 전화번호: 010-1234-5678'[/code]
주의할 점
정규 표현식이 올바른지 확인해야 합니다. 잘못된 정규 표현식을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
기본적으로 preg_match() 함수는 대소문자를 구분합니다. 만약 대소문자를 구분하지 않고 싶다면 정규 표현식에 /i 플래그를 추가하세요.[code]$text = 'Hello, World!';
$pattern = "/hello/i";
if (preg_match($pattern, $text, $matches)) {
echo '대소문자 구분 없이 일치하는 문자열을 찾았습니다: ' . $matches[0];
} else {
echo '일치하는 문자열을 찾을 수 없습니다.';
}
// 출력: '대소문자 구분 없이 일치하는 문자열을 찾았습니다: Hello';[/code]
하나의 문자열이 다른 문자열에 포함되어 있는지만 확인하려면 이 함수보다 더 빠르게 수행하는 strpos() 함수를 사용하는 것이 좋습니다. strpos() 함수는 간단하고 빠르게 작동하며, 문자열의 포함 여부를 확인하는 간단한 작업에 적합합니다.[code]$str = 'Hello, World!';
$substring = 'Hello';
$pos = strpos($str, $substring);
if ($pos === false) {
echo "문자열에 'Hello'를 찾을 수 없습니다.";
} else {
echo "문자열에 'Hello'가 포함되어 있습니다.";
}
// 출력: "문자열에 'Hello'가 포함되어 있습니다."[/code]
💊조건문
1번 코드[code]if($list[$i]['wr_2'] == 2 || preg_match('/세로직캠/', $clean_subject) || preg_match('/세로영상/', $clean_subject) || preg_match('/세로버전/', $clean_subject)){
...
}[/code]preg_match()를 3번 각각 호출합니다.
"세로직캠", "세로영상", "세로버전"을 개별적으로 검사합니다.
매번 정규식을 새로 파싱하고 검사하므로, 약간의 오버헤드가 생깁니다.
2번 코드[code]if($list[$i]['wr_2'] == 2 || preg_match('/세로직캠|세로영상|세로버전/', $clean_subject)){
...
}[/code]preg_match()를 한 번만 호출합니다.
정규식에 |(or)을 써서 세 가지 키워드 중 하나라도 매칭되면 true.
조금 더 빠르고, 코드도 깔끔합니다.
요약
기능상 거의 차이 없습니다. (결과는 같아요.)
다만, 2번 코드가 더 효율적이고 깔끔합니다.
특히 대상이 많아지면 (10개, 20개 키워드) 2번 방식이 훨씬 유리합니다.
만약 키워드가 많아질 것 같으면 아예 배열로 관리하고 루프를 돌리는 것도 좋아요.
예를 들면:[code]$keywords = ['세로직캠', '세로영상', '세로버전'];
if ($list[$i]['wr_2'] == 2 || preg_match('/'.implode('|', $keywords).'/', $clean_subject)) {
// 처리
}[/code]이렇게 하면 키워드 추가도 간단합니다.
키워드가 많아질 거라면, 무조건 깔끔하고 관리하기 쉬운 형태로 가야 합니다.
예를 들어, 이렇게 정리할 수 있어요[code]$keywords = ['세로직캠', '세로영상', '세로버전', '세로콘서트', '세로팬캠', '직캠모음', '팬미팅세로', /* 추가 계속 */];
$pattern = '/'.implode('|', array_map('preg_quote', $keywords)).'/';
if ($list[$i]['wr_2'] == 2 || preg_match($pattern, $clean_subject)) {
// 여기에 해당하는 코드 실행
}[/code]여기서 포인트는:
preg_quote()를 써서 키워드 안에 특수문자(예: ., *, ?)가 있어도 안전하게 escape 처리합니다.
implode('|', ...)로 자동으로 |로 연결해줍니다.
키워드를 배열로 관리하니까 나중에 추가/삭제가 엄청 편합니다.
만약 키워드가 정확히 일치해야 한다면, 패턴을 이렇게 더 엄격하게 만들 수도 있어요[code]$pattern = '/(' . implode('|', array_map('preg_quote', $keywords)) . ')/u';[/code]u 플래그를 붙이면 UTF-8 한글도 제대로 처리합니다.
필요하면 단어 경계(\b)를 넣을 수도 있어요.
요약하면:
키워드 많으면 → 배열
preg_match()는 한 번만 호출
preg_quote() 꼭 써주기
이걸 더 함수화해서 초간단 호출하게 만들수도 있어요[code]<?php
// 키워드 배열
$keywords = ['세로직캠', '세로영상', '세로버전', '세로콘서트', '세로팬캠', '직캠모음', '팬미팅세로'];
/**
* 문자열 안에 키워드 배열 중 하나라도 포함되어 있는지 검사하는 함수
*
* @param string $subject 검사할 문자열
* @param array $keywords 키워드 배열
* @return bool 매칭되면 true, 없으면 false
*/
function match_keywords($subject, array $keywords): bool {
if (empty($keywords)) {
return false; // 키워드가 비어있으면 매칭 없음
}
// 키워드를 안전하게 escape 처리하고 | 로 연결
$pattern = '/(' . implode('|', array_map('preg_quote', $keywords)) . ')/u';
return preg_match($pattern, $subject) === 1;
}
// 사용 예시
if ($list[$i]['wr_2'] == 2 || match_keywords($clean_subject, $keywords)) {
// 여기에 해당하는 코드 실행
}
?>
[/code]
설명
match_keywords($clean_subject, $keywords) → 이 한 줄로 간단하게 검사 가능!
키워드 추가는 $keywords 배열에만 추가하면 끝.
preg_quote()로 특수문자 안전하게 처리.
/u 플래그로 한글 문제 없이 매칭.
참고 예시[code]$clean_subject = '오늘 세로영상 올라왔어요!';
if (match_keywords($clean_subject, $keywords)) {
echo '키워드에 매칭되었습니다!';
} else {
echo '매칭된 키워드가 없습니다.';
}[/code]👉 결과: 키워드에 매칭되었습니다!
지금부터 match_keywords()를 확장해서
👉 다양한 옵션까지 지원하는 "완전체 버전"을 만들어 보겠습니다.[code]<?php
/**
* 문자열 안에 키워드 배열 중 하나라도 포함되어 있는지 검사하는 슈퍼 함수
*
* @param string $subject 검사할 문자열
* @param array $keywords 키워드 배열
* @param array $options 옵션 설정 [
* 'case_sensitive' => true|false (대소문자 구분할지),
* 'full_word' => true|false (완전 단어 일치할지),
* ]
* @return bool 매칭되면 true, 없으면 false
*/
function match_keywords(string $subject, array $keywords, array $options = []): bool {
if (empty($keywords)) {
return false;
}
// 옵션 기본값
$case_sensitive = $options['case_sensitive'] ?? true; // 기본은 대소문자 구분
$full_word = $options['full_word'] ?? false; // 기본은 부분 매칭
// 키워드 escape
$escaped_keywords = array_map('preg_quote', $keywords);
// 단어 경계(\b) 추가 (완전 일치 모드일 때)
if ($full_word) {
$pattern = '/\b(' . implode('|', $escaped_keywords) . ')\b/u';
} else {
$pattern = '/(' . implode('|', $escaped_keywords) . ')/u';
}
// 대소문자 무시 옵션
if (!$case_sensitive) {
$pattern .= 'i'; // 패턴 끝에 i 플래그 추가
}
return preg_match($pattern, $subject) === 1;
}
// 사용 예시
$keywords = ['세로직캠', '세로영상', '세로버전', '세로콘서트', '세로팬캠', '직캠모음', '팬미팅세로'];
if ($list[$i]['wr_2'] == 2 || match_keywords($clean_subject, $keywords)) {
// 처리
}
?>
[/code]
✨ 옵션 설명
case_sensitive - 대소문자 구분할지 (true: 구분, false: 무시) - true
full_word - 키워드를 "완전 단어"로만 매칭할지 (\b 사용) - false
📚 사용 예제
1. 기본 사용[code]match_keywords('오늘 세로영상 올렸어요!', $keywords);
// → true[/code]
2. 대소문자 무시[code]match_keywords('오늘 SERO영상 올렸어요!', $keywords, ['case_sensitive' => false]);
// → true (SERO == 세로로 처리)[/code]
3. 단어 완전 일치만 허용[code]match_keywords('팬미팅세로직캠', $keywords, ['full_word' => true]);
// → false (팬미팅세로+직캠은 붙어있어서 단어 단위 아님)[/code]
4. 대소문자 무시 + 완전 단어 매칭[code]match_keywords('SERO콘서트 갔다왔어요', $keywords, ['case_sensitive' => false, 'full_word' => true]);
// → true[/code]
🚀 요약
배열로 키워드를 관리하고
옵션으로 대소문자 무시/단어 완전 매칭까지 자유롭게!
코드도 깔끔하게 정리
🔥매칭된 키워드를 "찾아서 배열로 리턴" 하는
완전판 find_keywords() 함수
🛠 풀버전: find_keywords()[code]<?php
/**
* 문자열 안에 키워드 배열 중 일치하는 키워드를 찾아서 배열로 리턴하는 함수
*
* @param string $subject 검사할 문자열
* @param array $keywords 키워드 배열
* @param array $options 옵션 설정 [
* 'case_sensitive' => true|false (대소문자 구분할지),
* 'full_word' => true|false (완전 단어 일치할지),
* 'return_first' => true|false (처음 매칭 하나만 리턴할지),
* ]
* @return array 매칭된 키워드 배열 (또는 'return_first' 옵션이면 첫 번째 키워드만 배열로 리턴)
*/
function find_keywords(string $subject, array $keywords, array $options = []): array {
if (empty($keywords)) {
return [];
}
$case_sensitive = $options['case_sensitive'] ?? true;
$full_word = $options['full_word'] ?? false;
$return_first = $options['return_first'] ?? false;
$matched = [];
foreach ($keywords as $keyword) {
// 키워드 escape
$escaped = preg_quote($keyword, '/');
// 패턴 설정
$pattern = $full_word ? '/\b' . $escaped . '\b/u' : '/' . $escaped . '/u';
if (!$case_sensitive) {
$pattern .= 'i';
}
if (preg_match($pattern, $subject)) {
$matched[] = $keyword;
if ($return_first) {
break; // 첫 매칭 찾으면 바로 멈춤
}
}
}
return $matched;
}
?>
[/code]
🎯 주요 기능
여러 키워드 중 매칭된 것 모두 배열로 반환
return_first 옵션으로 첫 매칭만 반환 가능
대소문자 무시, 단어 완전 일치도 지원
매칭 결과가 없으면 빈 배열 반환
📚 사용 예제
1. 매칭된 키워드 모두 찾기[code]$keywords = ['세로직캠', '세로영상', '세로버전'];
$result = find_keywords('오늘 세로영상과 세로버전 둘 다 올라왔어요', $keywords);
print_r($result);
// 결과:
// Array ( [0] => 세로영상 [1] => 세로버전 )
[/code]
2. 대소문자 무시하고 찾기[code]$result = find_keywords('SERO영상 세로버전', $keywords, ['case_sensitive' => false]);
print_r($result);
// 결과:
// Array ( [0] => 세로영상 [1] => 세로버전 )[/code]
3. 매칭된 것 중 첫 번째만 반환[code]$result = find_keywords('오늘 세로영상과 세로버전 올라옴', $keywords, ['return_first' => true]);
print_r($result);
// 결과:
// Array ( [0] => 세로영상 )[/code]
4. 단어 경계 정확히 검사[code]$keywords = ['팬', '팬미팅'];
$result = find_keywords('팬미팅 갔다옴', $keywords, ['full_word' => true]);
print_r($result);
// 결과:
// Array ( [0] => 팬미팅 )[/code]※ 팬이 팬미팅 안에 포함되어 있어도, 단어 경계(\b) 때문에 팬만은 따로 잡히지 않습니다.
💬 요약
find_keywords() = 매칭된 키워드들을 배열로 뽑아줌.
옵션 조합해서 진짜 유연하게 사용 가능.
한 줄로 "어떤 키워드가 걸렸는지" 체크하고 "몇 개나 걸렸는지"도 알 수 있음.
댓글목록
등록된 댓글이 없습니다.
![]() ![]() |