정의 및 사용 방법
- PHP 버전
- 4+
preg_match_all() 함수는
주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치하는 모든 부분(match all)을 찾는 함수입니다.
특징
- 일치하는 모든 부분의 개수를 반환하며,
- 일치하는 패턴을 찾지 못하면
0을 반환합니다. - 일치한 항목들을 담은 배열을 이 함수의 매개변수로 전달한 변수에 할당합니다.
- 에러가 발생한 경우
false를 반환합니다.
기본 예제
// 주어진 문자열
$string = '이것은 123과 456을 포함한 샘플 텍스트입니다.';
// 패턴: 숫자 찾기
$pattern = '/\d+/';
// preg_match_all 함수 사용
$matches = array();
$num_of_matches = preg_match_all($pattern, $string, $matches);
// 결과 출력
if ($num_of_matches > 0) {
echo '일치하는 부분의 개수: ' . $num_of_matches . '<br>';
echo '일치한 항목들을 담은 배열: '; print_r($matches);
} else {
echo '일치하는 부분이 없습니다. (false 반환)';
}
/*
출력:
일치하는 부분의 개수: 2
일치한 항목들을 담은 배열: Array ( [0] => Array ( [0] => 123 [1] => 456 ) )
*/
문자열 내에서 정규 표현식을 사용하여 특정 패턴을 찾아 다른 문자열로 바꾸려면 preg_replace() 함수를 사용하세요.
구문
preg_match_all(
string $pattern,
string $subject,
array &$matches = null,
int $flags = 0,
int $offset = 0
): int|false
/* preg_match_all(
패턴,
검색 대상이 되는 문자열,
일치하는 부분을 저장할 배열[,
추가적인 설정을 지정하는 플래그[,
검색을 시작할 문자열 내의 오프셋]]
);
*/
매개변수
$pattern |
필수. 검색할 정규 표현식 패턴입니다. |
|---|---|
$subject |
필수. 검색 대상이 되는 문자열입니다. |
&$matches |
필수. 정규 표현식 패턴에 일치하는 결과를 저장할 배열입니다.
이 배열은 함수 호출 후에 채워집니다. 참조 변수입니다.
|
$flags |
옵션. 추가적인 설정을 지정하는 플래그입니다.
다음과 같은 플래그를 사용할 수 있습니다.
|
$offset |
옵션. 검색을 시작할 문자열 내의 오프셋입니다. 0부터 시작합니다.
이것을 사용하면 대상 문자열의 일부분만을 대상으로 할 수 있습니다. |
반환 값
- 일치하는 모든 부분의 개수를 반환하며,
- 일치하는 패턴을 찾지 못하면
0을 반환합니다. - 일치한 항목들을 담은 배열을 이 함수의 매개변수로 전달한 변수에 할당합니다.
- 에러가 발생한 경우
false를 반환합니다.
매개변수와 반환 값 예시
일치하는 모든 부분의 개수를 반환
preg_match_all() 함수는 대상 문자열에서 모든 일치하는 부분을 찾습니다. 반환 값은 일치하는 부분의 총 개수가 됩니다.
$pattern = '/apple/';
$subject = "apple orange banana apple";
$result = preg_match_all($pattern, $subject);
if ($result !== false) {
var_dump($result); // 출력: int(2)
}
반면에 이 함수와 유사한 preg_match() 함수는
일치하는 패턴을 문자열에서 처음으로 발견되면 검색을 중단하고 1을 반환합니다.
일치하는 패턴을 찾지 못하면 0을 반환
일치하는 패턴을 찾지 못하면 0을 반환합니다. 여기에서 주의할 점은 false를 반환하지 않는다는 것입니다. false는 에러가 발생한 경우에 반환됩니다.
$pattern = '/grape/';
$subject = "apple orange banana apple";
$result = preg_match_all($pattern, $subject);
if ($result !== false) {
var_dump($result); // 출력: int(0)
}
에러가 발생하면 false를 반환
error_reporting(0); // 에러 표시 비활성화
$pattern = '/apple'; // 유효하지 않은 정규 표현식을 사용
$subject = "apple orange banana apple";
$result = preg_match_all($pattern, $subject);
if ($result !== false) {
var_dump($result);
} else {
echo '에러가 발생했습니다.';
}
// 출력: '에러가 발생했습니다.'
일치한 항목들을 담은 배열을 매개변수로 전달한 변수에 할당
preg_match_all() 를 사용하여 일치한 항목들을 담은 배열을 다른 변수에 할당하려면 해당 배열을 참조로 전달하면 됩니다.
먼저 예시를 통해 살펴보겠습니다.
// 주어진 문자열에서 숫자 찾기
$string = '이것은 123과 456을 포함한 샘플 텍스트입니다.';
// 패턴: 숫자 찾기
$pattern = '/\d+/';
// $matches라는 빈 배열을 선언하여 할당할 공간을 마련합니다.
$matches = array();
// $matches를 매개변수에 할당합니다.
$num_of_matches = preg_match_all($pattern, $subject, $matches);
// 결과 출력
if ($num_of_matches > 0) {
print_r($matches); // Array ( [0] => Array ( [0] => 123 [1] => 456 ) )
}
여기서 preg_match_all() 함수의 세 번째 매개변수로 $matches 배열을 전달하고 있습니다. 이때 $matches 배열은 함수 호출 후에 일치하는 부분 문자열들로 채워집니다. 코드에서 print_r($matches)를 통해 배열의 내용을 출력하고 있습니다.
이렇게 하면 $matches 배열에 일치한 항목들이 할당되며, 함수 외부에서도 이 값을 사용할 수 있습니다.
활용 예제
preg_match_all() 함수는 이메일 주소, 전화번호, URL과 같은 특정 패턴의 문자열을 검사할 때 유용합니다. 또한, 다양한 상황에서 유용하게 활용될 수 있습니다. 여기에는 몇 가지 예제를 다룹니다.
이메일 주소 검사
$string = '문의는 help@example.com 또는 support@example.org 으로 연락 주시기 바랍니다.';
$pattern = '/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/';
$matches = array();
$result = preg_match_all($pattern, $string, $matches);
if ($result !== false) {
print_r($matches[0]);
} else {
echo '이메일 주소 형식이 없습니다.';
}
// 출력: Array ( [0] => help@example.com [1] => support@example.org )
핸드폰번호 검사
$string = '문의는 010-9876-5432 또는 010-9876-5439로 연락 주세요.';
$pattern = '/\d{3}-\d{4}-\d{4}/';
$matches = array();
$result = preg_match_all($pattern, $string, $matches);
if ($result !== false) {
print_r($matches[0]);
} else {
echo '핸드폰번호 형식이 없습니다.';
}
// 출력: Array ( [0] => 010-9876-5432 [1] => 010-9876-5439 )
URL 검사
$string = '더 많은 정보는 https://www.example.co.kr에서 확인하세요.';
$pattern = '/\b(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9-]+(?:\.[a-z]{2,})+(?:\/[^\s]*)?\b/';
$matches = array();
$result = preg_match_all($pattern, $string, $matches);
if ($result !== false) {
print_r($matches[0]);
} else {
echo 'URL 형식이 없습니다.';
}
// 출력: Array ( [0] => https://www.example.co.kr )
로그 파일에서 특정 이벤트 추출
// 로그 파일을 문자열로 읽어옵니다.
$log = file_get_contents('error.log');
// 정규 표현식 패턴을 정의합니다.
$pattern = '/ERROR: (.+)/';
// preg_match_all 함수를 사용하여 정규 표현식 패턴과 일치하는 모든 부분을 찾아 $matches 배열에 저장합니다.
preg_match_all($pattern, $log, $matches);
// 만약 $matches 배열에 데이터가 있으면 해당 데이터를 출력합니다.
if (!empty($matches[1])) {
echo 'Errors found:' . PHP_EOL;
print_r($matches[1]);
} else {
echo 'No errors found.';
}
위 코드에서 사용된 정규 표현식 /ERROR: (.+)/에 대한 설명을 추가하겠습니다.
$pattern = '/ERROR: (.+)/';: 이 정규 표현식은 다음과 같이 구성됩니다.
/: 정규 표현식의 시작과 끝을 나타냅니다.ERROR:: 문자열 "ERROR: "과 정확하게 일치합니다.(.+): 괄호로 묶인 부분은 일치하는 문자열의 임의의 문자열을 나타냅니다..+는 최소한 하나 이상의 모든 문자를 나타내며,(.+)는 이러한 패턴을 괄호로 묶어 추출할 수 있도록 합니다.
따라서, 이 정규 표현식은 "ERROR: " 다음에 나오는 모든 문자열을 추출하게 됩니다.
예를 들어, 다음과 같은 로그 파일 내용에서
2023-01-01 ERROR: Something went wrong.
2023-01-02 ERROR: Another error occurred.
위의 정규 표현식을 사용하면 다음과 같은 결과가 추출될 것입니다.
Something went wrong.Another error occurred.
이것은 "ERROR: " 다음에 나오는 모든 문자열을 추출하여 출력하는 코드입니다.
같이 보기
- PHP preg_match() 함수 – 개념 정리 및 사용 예제
- PHP preg_split() 함수 - 개념 정리 및 사용 예제
- PHP strpos() 함수 – 대소문자 구분해서 문자열에 특정 문자 포함 여부 확인
- PHP stripos() 함수 – 대소문자를 구분 없이 문자열에 특정 문자 포함 여부 확인
- PHP mb_strpos() 함수 – strpos()의 한글 지원 기능 제공
- PHP str_contains() 함수 – 대소문자 구분해서 문자열에 특정 문자 포함 여부 확인
- PHP substr() 함수 - 문자열을 잘라서 추출하기
- PHP mb_substr() 함수 – substr()의 한글 깨짐을 해결하기
- PHP mb_stripos() 함수 – stripos()의 한글 지원 기능 제공
- PHP str_replace() 함수 – 문자열에서 특정 문자열을 다른 문자열로 바꾸는 함수
- PHP trim() 함수 - 문자열의 양쪽 끝에서 공백 또는 지정된 문자열 제거
- 자바스크립트 문자열 match() 함수 - 개념 정리 및 사용 예제