str_contains($haystack, $needle)는 $needle이 $haystack 어딘가에 있으면 true, 아니면 false를 반환합니다. PHP 8.0에서 추가되었으며 대소문자를 구분합니다.
strpos()와 달리 진짜 불리언을 반환하므로 "위치 0에서 찾았는데 false처럼 보이는" 함정이 없습니다.
문법
str_contains(string $haystack, string $needle): bool
str_starts_with(string $haystack, string $needle): bool
str_ends_with(string $haystack, string $needle): bool
셋 다 PHP 8.0에서 추가되었고 바이트 단위로 동작하므로, mb_ 버전 없이도 한글, 일본어 등 UTF-8 텍스트를 올바르게 처리합니다.
str_starts_with와 str_ends_with로 시작과 끝 확인하기
대소문자를 무시하는 포함 확인
str_icontains()는 없습니다. 먼저 두 문자열을 소문자로 바꾸세요. mb_strtolower()는 strtolower()가 그대로 두는 É나 키릴 문자처럼 ASCII 밖의 문자도 소문자로 바꿉니다.
빈 문자열은 true를 반환한다
빈 문자열은 빈 문자열을 포함해 모든 문자열에서 발견됩니다. 사용자가 비워 둔 검색창에서 찾는 값이 올 때 문제가 됩니다.
여러 단어 중 하나 또는 모두 포함하는지 확인하기
str_contains()는 찾는 값을 하나만 받습니다. 찾는 값 배열을 반복하세요. "하나라도"라면 하나가 일치하는 즉시, "모두"라면 하나가 실패하는 즉시 반환합니다.
문자열의 부분 문자열이 아니라 값이 배열의 요소 중 하나인지 확인하려면 in_array()를 쓰세요.
PHP 8 이전: strpos !== false
PHP 7에서도 실행되어야 하는 코드는 엄격한 비교와 함께 strpos()를 씁니다. 빈 문자열을 찾는 경우만 빼면 str_contains()와 같은 답을 줍니다. PHP 7의 strpos()는 Warning: strpos(): Empty needle을 출력하고 false를 반환했습니다.
텍스트가 있는데도 마지막 줄은 bool(false)를 출력합니다. php가 위치 0에 있기 때문입니다. 이런 확인을 str_contains()로 바꾸는 것은 가장 쉬운 PHP 8 업그레이드 중 하나입니다.
자주 묻는 질문
PHP에서 문자열에 단어가 포함되어 있는지 확인하려면 어떻게 하나요?
PHP 8에서는 true나 false를 반환하는 str_contains($haystack, $needle)를 쓰세요: str_contains('Hello world', 'world')는 true입니다. PHP 7에서는 strpos($haystack, $needle) !== false를 쓰세요.
str_contains는 대소문자를 구분하나요?
네. 대소문자 무시 확인을 하려면 양쪽을 소문자로 바꾸세요: str_contains(mb_strtolower($haystack), mb_strtolower($needle)). 또는 stripos($haystack, $needle) !== false를 쓰세요.
str_contains가 빈 문자열에 대해 true를 반환하는 이유는 무엇인가요?
모든 문자열은 빈 문자열을 포함하므로 str_contains('abc', '')는 true를 반환합니다. 찾는 값이 사용자 입력에서 온다면 먼저 비어 있지 않은지 확인하세요.
PHP에서 문자열이 특정 값으로 시작하거나 끝나는지 확인하려면 어떻게 하나요?
PHP 8.0에서 함께 추가된 str_starts_with($s, 'http')와 str_ends_with($s, '.pdf')를 쓰세요. str_contains()처럼 대소문자를 구분하고 bool을 반환합니다.