preg_match_all()
함수의 사용법
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()
함수의 형식은 다음과 같습니다.
구문
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() 함수 - 개념 정리 및 사용 예제