정의 및 사용 방법
- PHP 버전
- 5+
strripos() 함수는
문자열에서 인수로 전달된 문자열을 찾아 마지막으로 검색된(나타나는) 위치의 인덱스를 반환합니다.
이 함수는 대소문자를 구분하지 않습니다.
인수로 전달된 문자열을 찾을 수 없다면 false를 반환합니다.
이 함수는 다음과 같은 상황에서 많이 사용됩니다.
- 파일명에서 확장자(
.PNG,.Png,.png등)를 대소문자 구분 없이 찾을 때 - 문자열에서 특정 단어가 마지막으로 나타나는 위치를 대소문자 구분 없이 찾을 때
참고하세요!
strripos() 함수는 strrpos() 함수의 대소문자를 구분하지 않는 버전입니다.
특징
- 대소문자를 구분하지 않습니다.
- 한글과 같은 multi-byte(멀티바이트) 문자열을 지원하지 않습니다.
기본 예제
$str = 'Hello, World! Welcome to the WORLD!';
$substring = 'world'; // 대소문자(World!, WORLD!, world)를 구분하지 않음
$pos = strripos($str, $substring);
if ($pos !== false) {
echo "찾은 위치: $pos";
} else {
echo '찾을 수 없습니다.';
}
// 출력: 찾은 위치: 29
/*
* 주의하세요!
* 문자열에서 인덱스는 0부터 시작합니다.
* 첫 번째 문자의 인덱스는 0이고, 두 번째 문자의 인덱스는 1입니다.
*/
Hello, World! Welcome to the WORLD!
↑ ↑
첫 번째 마지막
구문
strripos(string $haystack, string $needle, int $offset = 0): int|false
매개변수
$haystack |
검색 대상이 되는 문자열입니다. |
|---|---|
$needle |
검색할 문자열입니다. 대소문자를 구분하지 않습니다.
|
$offset |
옵션. 검색을 시작할 0 기반의 인덱스입니다.
|
반환 값
대상 문자열에서 인수로 전달된 문자열($needle)이 마지막으로 나타나는 위치(인덱스)를 반환합니다.
문자열 위치(인덱스)는 1이 아닌 0부터 시작한다는 점에 유의하세요.
$offset 값이 검색 대상 문자열($haystack)의 길이를 초과하면 검색을 시작할 위치가 존재하지 않기 때문에 ValueError 예외가 발생합니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 8.2.0 | PHP 8.2.0 이전에는 setlocale()에 따라 일부 비ASCII 문자(예: 한글, 일본어, 중국어 등)의 대소문자 비교 결과가 달라질 수 있었습니다. PHP 8.2.0부터는 오직 ASCII 문자만 대소문자 구분 없이 비교합니다. 그 외 문자는 그냥 바이트 단위로 비교합니다. |
| 8.0.0 | $needle에 빈 문자열('')을 허용합니다. |
| 8.0.0 | $needle에 정수형(int) 값을 전달하는 기능이 완전히 지원되지 않게 되었습니다. |
| 7.3.0 | $needle에 정수형(int) 값을 전달하는 기능이 사용 중단(deprecated) 처리되었습니다. |
주의할 점
문자열에서 인덱스는 0부터 시작합니다.
첫 번째 문자의 인덱스는 0이고, 두 번째 문자의 인덱스는 1입니다.
$newstring = 'abcdef ghijk';
$pos = strripos($newstring, 'a');
var_dump($pos); // int(0)
strripos() 함수의 반환 값을 조건식에서 사용할 때에는 주의가 필요합니다.
이 함수는 문자열의 위치를 정수로 반환하며, 첫 번째 위치에 문자열이 존재하는 경우 반환 값은 0입니다.
PHP에서 0은 느슨한 비교(==)에서 false로 평가되므로, 반환 값을 확인할 때는 엄격한 타입 비교 연산자인 === 또는 !==를 사용해야 합니다.
대상 문자열에서 주어진 문자열의 위치가 첫 번째에 위치하고 있다고 가정해 보겠습니다.
이 경우 반환 값은 0이 됩니다.
0은 == 연산자로 평가하면 false를 반환하게 됩니다.
실제 주어진 문자열이 존재하지만 false를 반환하기 때문에 부울(boolean) 타입으로 반환 값을 평가하려면 엄격한 타입 비교가 수행되어 하기 때문에 === 연산자를 사용해야 합니다.
$str = 'Hello, World!';
$substring = 'Hello';
$pos = strripos($str, $substring);
var_dump($pos); // int(0)
if ($pos === false) {
echo "문자열에 'Hello'를 찾을 수 없습니다.";
} else {
echo "문자열에 'Hello'가 포함되어 있습니다.";
}
// 출력: "문자열에 'Hello'가 포함되어 있습니다."
/* 또는 */
if ($pos !== false) {
echo "문자열에 'Hello'가 포함되어 있습니다.";
} else {
echo "문자열에 'Hello'를 찾을 수 없습니다.";
}
// 출력: "문자열에 'Hello'가 포함되어 있습니다."
strripos() 함수는 한글과 같은 multi-byte 문자열을 문자 단위가 아닌 바이트 단위로 처리하기 때문에 원하지 않는 결과가 발생할 수 있습니다.
부연설명
UTF-8 인코딩에서 영어와 숫자 같은 ASCII 문자는 1 byte로 표현되지만, 한글이나 일본어, 중국어 등은 여러 byte를 사용합니다.
이처럼 하나의 문자를 표현하기 위해 2 byte 이상을 사용하는 문자를 multi-byte(멀티바이트) 문자열이라고 합니다.
$str = '반갑습니다. 환영합니다!';
$substring = '환영';
$pos = strripos($str, $substring);
if ($pos !== false) {
echo "찾은 위치: $pos";
} else {
echo '찾을 수 없습니다.';
}
// 출력: 찾은 위치: 17 <= 원하지 않는 결과가 발생합니다.
mb_strripos() 함수는 strripos() 함수와 거의 동일한 기능을 하지만, 한글과 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공한다는 큰 차이점이 있습니다.
활용 예제
strripos() 함수는 다음과 같은 상황에서 많이 사용됩니다.
대소문자를 구분하지 않고 파일 확장자 찾기
strripos() 함수는 영문자의 대소문자를 구분하지 않고 문자열을 검색하기 때문에 .PNG, .Png, .png와 같은 다양한 확장자를 모두 찾을 수 있습니다.
$filename = 'image.test.PNG'; // 파일명
$extension = '.png'; // 찾을 확장자
$dot_position = strripos($filename, $extension);
if ($dot_position !== false) {
echo "찾은 위치: $dot_position";
} else {
echo '확장자를 찾을 수 없습니다.';
}
// 출력: 찾은 위치: 10