정의 및 사용 방법
- PHP 버전
- 4+
strrpos() 함수는
문자열에서 인수로 전달된 문자열을 찾아 마지막으로 검색된(나타나는) 위치의 인덱스를 반환합니다.
인수로 전달된 문자열을 찾을 수 없다면 false를 반환합니다.
이 함수는 다음과 같은 상황에서 많이 사용됩니다.
- 파일명에서 확장자 구분자(.)의 위치를 찾을 때 (예:
image.test.png에서 마지막.위치 찾기) - 문자열에서 마지막 공백(
" ")의 위치를 찾아 마지막 단어를 추출하거나 문자열을 분리할 때 - 문자열에서 마지막 구분자의 위치를 찾을 때 (예: 쉼표나 특수문자로 구분된 데이터에서 마지막 항목을 분리할 때)
- URL 또는 파일 경로에서 마지막
/위치를 찾을 때
특징
- 대소문자를 구분합니다.
- 한글과 같은 multi-byte(멀티바이트) 문자열을 지원하지 않습니다.
기본 예제
$str_filename = 'image.test.png';
$str_extension = '.';
$extension_position = strrpos($str_filename, $str_extension);
if ($extension_position !== false) {
echo "찾은 위치: $extension_position";
} else {
echo '찾을 수 없습니다.';
}
// 출력: 찾은 위치: 10
/*
* 주의하세요!
* 문자열에서 인덱스는 0부터 시작합니다.
* 첫 번째 문자열의 인덱스는 0이고, 두 번째 문자열의 인덱스는 1입니다.
*/
구문
strrpos(string $haystack, string $needle, int $offset = 0): int|false
매개변수
$haystack |
검색 대상이 되는 문자열입니다. |
|---|---|
$needle |
검색할 문자열입니다.
|
$offset |
옵션. 검색을 시작할 0 기반의 인덱스입니다.
|
반환 값
대상 문자열에서 인수로 전달된 문자열($needle)이 마지막으로 나타나는 위치(인덱스)를 반환합니다.
문자열 위치(인덱스)는 1이 아닌 0부터 시작한다는 점에 유의하세요.
주어진 문자열($needle)이 포함되어 있지 않으면 false를 반환합니다.
$offset 값이 검색 대상 문자열($haystack)의 길이를 초과하면 검색을 시작할 위치가 존재하지 않기 때문에 ValueError 예외가 발생합니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 8.0.0 | $needle에 빈 문자열('')을 허용합니다. |
| 8.0.0 | $needle에 정수형(int) 값을 전달하는 기능이 완전히 지원되지 않게 되었습니다. |
| 7.3.0 | $needle에 정수형(int) 값을 전달하는 기능이 사용 중단(deprecated) 처리되었습니다. |
주의할 점
strrpos() 함수는 대소문자를 구분합니다.
$str = 'Hello, World!';
$substring = 'world';
$pos = strrpos($str, $substring);
if ($pos !== false) {
echo "문자열에 'world!'가 포함되어 있습니다.";
} else {
echo "대소문자가 일치하지 않아 'world'를 찾을 수 없습니다.";
}
// 출력: "대소문자가 일치하지 않아 'world'를 찾을 수 없습니다."
만약 대소문자를 구분하지 않고 문자열에서 인수로 전달된 문자열을 찾아 마지막으로 검색된(나타나는) 위치를 찾고자 한다면, strripos() 함수를 사용하세요.
문자열에서 인덱스는 0부터 시작합니다.
첫 번째 문자의 인덱스는 0이고, 두 번째 문자의 인덱스는 1입니다.
$newstring = 'abcdef ghijk';
$pos = strrpos($newstring, 'a');
var_dump($pos); // int(0)
strrpos() 함수의 반환 값을 조건식에서 사용할 때에는 주의가 필요합니다.
이 함수는 문자열의 위치를 정수로 반환하며, 첫 번째 위치에 문자열이 존재하는 경우 반환 값은 0입니다.
PHP에서 0은 느슨한 비교(==)에서 false로 평가되므로, 반환 값을 확인할 때는 엄격한 타입 비교 연산자인 === 또는 !==를 사용해야 합니다.
대상 문자열에서 주어진 문자열의 위치가 첫 번째에 위치하고 있다고 가정해 보겠습니다.
이 경우 반환 값은 0이 됩니다.
0은 == 연산자로 평가하면 false를 반환하게 됩니다.
실제 주어진 문자열이 존재하지만 false를 반환하기 때문에 부울(boolean) 타입으로 반환 값을 평가하려면 엄격한 타입 비교가 수행되어 하기 때문에 === 연산자를 사용해야 합니다.
$str = 'Hello, World!';
$substring = 'Hello';
$pos = strrpos($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'가 포함되어 있습니다."
strrpos() 함수는 한글과 같은 multi-byte 문자열을 문자 단위가 아닌 바이트 단위로 처리하기 때문에 원하지 않는 결과가 발생할 수 있습니다.
부연설명
UTF-8 인코딩에서 영어와 숫자 같은 ASCII 문자는 1 byte로 표현되지만, 한글이나 일본어, 중국어 등은 여러 byte를 사용합니다.
이처럼 하나의 문자를 표현하기 위해 2 byte 이상을 사용하는 문자를 multi-byte(멀티바이트) 문자열이라고 합니다.
$str = '반갑습니다. 환영합니다!';
$substring = '환영';
$pos = strrpos($str, $substring);
if ($pos !== false) {
echo "찾은 위치: $pos";
} else {
echo '찾을 수 없습니다.';
}
// 출력: 찾은 위치: 17 <= 원하지 않는 결과가 발생합니다.
mb_strrpos() 함수는 strrpos() 함수와 거의 동일한 기능을 하지만, 한글과 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공한다는 큰 차이점이 있습니다.
활용 예제
strrpos() 함수는 다음과 같은 상황에서 많이 사용됩니다.
파일명에서 확장자 추출하기
$filename = 'image.test.png'; // 파일명
$dot_position = strrpos($filename, '.'); // 파일명에서 마지막 . 위치 찾기
if ($dot_position !== false) {
$extension = substr($filename, $dot_position + 1); // 마지막 . 위치 바로 다음부터 끝까지의 문자열 추출하기
echo "파일 확장자: $extension";
} else {
echo '확장자를 찾을 수 없습니다.';
}
// 출력: 파일 확장자: png
코드 부연설명
substr() 함수는 문자열에서 주어진 특정 위치부터 특정 길이만큼의 문자열을 잘라서 추출하는 함수입니다.
파일 경로에서 파일명 추출하기
$filepath = '/var/www/html/images/photo.jpg'; // 파일 경로
$slash_position = strrpos($filepath, '/'); // 파일 경로에서 마지막 / 위치 찾기
if ($slash_position !== false) {
$filename = substr($filepath, $slash_position + 1); // 마지막 / 위치 바로 다음부터 끝까지의 문자열 추출하기
echo "파일명: $filename";
} else {
echo '파일명을 찾을 수 없습니다.';
}
// 출력: 파일명: photo.jpg
문자열에서 마지막 단어 추출하기
$str = 'PHP is a popular programming language'; // 문자열
$space_position = strrpos($str, ' '); // 문자열에서 마지막 공백 위치 찾기
if ($space_position !== false) {
$last_word = substr($str, $space_position + 1); // 마지막 공백 위치 바로 다음부터 끝까지의 문자열 추출하기
echo "마지막 단어: $last_word";
} else {
echo '마지막 단어를 찾을 수 없습니다.';
}
// 출력: 마지막 단어: language
URL에서 마지막 경로(path segment, /) 추출하기
$url = 'https://example.com/products/item/detail'; // URL
$last_slash_position = strrpos($url, '/'); // URL에서 마지막 / 위치 찾기
if ($last_slash_position !== false) {
$last_path = substr($url, $last_slash_position + 1); // 마지막 / 위치 바로 다음부터 끝까지의 문자열 추출하기
echo "마지막 경로: $last_path";
} else {
echo '마지막 경로를 찾을 수 없습니다.';
}
// 출력: 마지막 경로: detail