PHP 배열에서 특정 문자열이 포함된 요소 검색하기
배열에 저장된 여러 값 중에서 특정 단어나 문자열이 포함된 요소만 골라내야 하는 경우가 종종 있습니다. 예를 들어 다음과 같은 배열이 있다고 가정해 보겠습니다.
$subject = array('JavaScript', 'Java', 'PHP language', 'Python Language');이 배열에서 'Language'라는 단어가 포함된 값만 추출하고 싶다면 어떻게 해야 할까요?
$valueToSearch = 'Language';
이런 조건의 매칭 작업에는 PHP의 preg_match() 함수를 사용하는 것이 가장 효과적입니다. preg_match()는 정규표현식 패턴을 기반으로 문자열을 검색하며, 패턴이 일치하면 1을, 일치하지 않으면 0을 반환하기 때문에 if 문과 함께 사용하기에 적합합니다.
정규표현식 패턴의 핵심 요소
- \b : 단어 경계(word boundary)를 나타내며, 단어 단위로 정확하게 매칭할 수 있도록 도와줍니다.
- /i : 대소문자를 구분하지 않는 플래그입니다. 따라서 'language', 'Language', 'LANGUAGE' 등 모두 동일하게 매칭됩니다.
예제 코드
전체 PHP 코드는 다음과 같습니다.
<!DOCTYPE html>
<html>
<body>
<?php
$subject = array('JavaScript', 'Java', 'PHP language', 'Python Language');
$valueToSearch = 'Language';
$result = array();
foreach($subject as $t => $value) {
if(preg_match("/\b$valueToSearch\b/i", $value)){
$result[$t] = $value;
}
}
print_r($result);
?>
</body>
</html>실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
Array ( [2] => PHP language [3] => Python Language )
결과 분석
출력 결과를 보면 원본 배열에서 인덱스 2와 3에 해당하는 'PHP language'와 'Python Language'만 결과 배열에 담긴 것을 확인할 수 있습니다. 이 두 요소는 'Language'라는 단어를 포함하고 있기 때문입니다. 반면 'JavaScript'와 'Java'는 해당 단어가 없으므로 자연스럽게 제외되었습니다.
참고: 간단한 부분 문자열 검색이라면
단어 경계까지 고려할 필요 없이 단순히 부분 문자열 포함 여부만 확인하면 된다면, 정규표현식 대신 stripos()(대소문자 구분 없음) 또는 strpos()(대소문자 구분) 함수를 array_filter()와 조합해 사용하는 방법도 좋은 대안입니다. 다만 정확한 단어 단위 매칭이 필요하다면 위 예제처럼 preg_match()와 \b 패턴을 활용하는 것이 가장 안전합니다.