strpos($haystack, $needle)는 $haystack 안에서 첫 번째 $needle의 위치를 0부터 세어 반환하고, 없으면 false를 반환합니다. 처음에서 일치하면 0을 반환하므로 결과는 항상 !== false로 확인하세요.
PHP 8에서 예, 아니요만 필요하다면 str_contains()가 더 명확합니다. 위치가 중요할 때 strpos()를 쓰세요.
문법
strpos(string $haystack, string $needle, int $offset = 0): int|false
검색은 대소문자를 구분합니다. $offset은 어디서부터 찾을지 알려 주며, 음수 오프셋은 문자열 끝에서부터 셉니다.
!== false 함정
느슨한 비교(==)에서 0과 false는 같습니다. 그래서 엄격하지 않은 확인은 위치 0의 일치를 "찾지 못함"으로 취급합니다.
같은 규칙이 stripos(), strrpos(), array_search()에도 적용되며, 모두 실제 일치에 대해 0을 반환할 수 있습니다.
stripos로 대소문자 무시 검색
stripos()는 같은 인수를 받고 ASCII 문자의 대소문자를 무시합니다.
strrpos로 마지막 일치 찾기
strrpos()는 마지막 일치의 위치를 반환합니다. 파일 확장자나 경로의 마지막 부분을 얻는 표준적인 방법입니다.
파일 이름이라면 pathinfo($file, PATHINFO_EXTENSION)이 이 일을 대신합니다. 위치에서 문자열을 자르는 방법은 substr() 페이지에서 다룹니다.
오프셋에서 검색 시작하기
세 번째 인수는 문자열의 앞부분을 건너뜁니다. 음수 오프셋은 끝에서 그만큼 앞에서 시작합니다.
모든 위치 찾기
strpos()는 일치 하나를 찾습니다. 모두 찾으려면 반복하면서 매번 일치 뒤로 오프셋을 옮기세요.
개수만 필요하다면 substr_count($text, 'the')가 더 짧습니다. 패턴이라면 PREG_OFFSET_CAPTURE와 함께 쓰는 preg_match_all()이 모든 일치를 위치와 함께 반환합니다.
일본어 텍스트: 바이트 위치와 문자 위치
strpos()는 멀티바이트 텍스트를 올바르게 찾지만, 반환하는 숫자는 바이트 단위입니다. UTF-8에서 가나와 일반 한자(한글도)는 각각 3바이트이므로, 모두 일본어인 텍스트에서는 바이트 위치가 문자 위치의 세 배이고, 섞인 텍스트에서는 둘이 덜 분명한 방식으로 어긋납니다. mb_strpos()는 mb_substr()가 기대하는 문자 단위를 반환합니다.
둘을 섞는 것은 고전적인 버그입니다. strpos()의 결과를 mb_substr()에 넘기면 문자열의 너무 뒤쪽에서 시작합니다. strpos는 substr와, mb_strpos는 mb_substr와 함께 쓰세요.
자주 묻는 질문
PHP에서 strpos()는 무엇을 반환하나요?
첫 번째 일치의 위치를 0부터 센 정수로 반환하고, 찾는 문자열이 없으면 false를 반환합니다. strpos('hello', 'l')은 2를 반환합니다.
strpos()에 !== false가 필요한 이유는 무엇인가요?
맨 처음에서 일치하면 0이 반환되고, 0 == false는 참이기 때문입니다. if (strpos($s, 'a'))는 위치 0의 일치를 "찾지 못함"으로 취급합니다. 항상 strpos($s, 'a') !== false로 비교하세요.
strpos, stripos, strrpos의 차이는 무엇인가요?
strpos()는 첫 번째 일치를 찾으며 대소문자를 구분합니다. stripos()는 대소문자를 무시하고 첫 번째 일치를 찾습니다. strrpos()는 마지막 일치를 찾습니다. strripos()는 대소문자를 무시하고 마지막 일치를 찾습니다.
문자열에 텍스트가 포함되어 있는지 확인할 때 strpos와 str_contains 중 무엇을 써야 하나요?
PHP 8에서는 단순한 true나 false를 반환하고 위치 0 함정이 없는 str_contains($haystack, $needle)를 쓰세요. 위치 자체가 필요할 때 strpos()를 쓰세요.
한글이나 일본어 텍스트에서 strpos를 쓰려면 어떻게 하나요?
strpos()는 멀티바이트 텍스트도 올바르게 찾지만 바이트 위치를 반환합니다. 그 위치를 mb_substr()에 넘기거나 사용자에게 보여 준다면 문자 단위 위치를 반환하는 mb_strpos()를 쓰세요.