정의 및 사용 방법
- PHP 버전
- 4.0.6+
mb_strrpos() 함수는
문자열에서 인수로 전달된 문자열을 찾아 마지막으로 나타나는 위치의 인덱스를 반환합니다.
한글과 같은 multi-byte(멀티바이트) 문자열을 지원합니다.
인수로 전달된 문자열을 찾을 수 없다면 false를 반환합니다.
이 함수는 strrpos() 함수와 거의 동일한 기능을 하지만,
한글, 일본어, 중국어와 같은 multi-byte 문자열을 안전하게 처리할 수 있다는 큰 차이점이 있습니다.
UTF-8 인코딩에서 영어와 숫자 같은 ASCII 문자는 1 byte로 표현되지만, 한글이나 일본어, 중국어 등은 여러 byte를 사용합니다.
이처럼 하나의 문자를 표현하기 위해 2 byte 이상을 사용하는 문자를 multi-byte(멀티바이트) 문자열이라고 합니다.
특징
- 대소문자를 구분합니다.
- 한글과 같은 multi-byte(멀티바이트) 문자열을 지원합니다.
기본 예제
$str = '반갑습니다. 환영합니다!';
$substring = '환영';
$pos = mb_strrpos($str, $substring, 0, 'UTF-8');
if ($pos !== false) {
echo "찾은 위치: $pos";
} else {
echo '찾을 수 없습니다.';
}
// 출력: 찾은 위치: 7
/*
* 주의하세요!
* 문자열에서 인덱스는 0부터 시작합니다.
* 첫 번째 문자의 인덱스는 0이고, 두 번째 문자의 인덱스는 1입니다.
*/
한글에서 strrpos() 함수의 문제점
strrpos() 함수는 한글과 같은 multi-byte 문자열을 지원하지 않아 원하지 않는 결과가 발생합니다.
$str = '반갑습니다. 환영합니다!';
$substring = '환영';
$pos = strrpos($str, $substring);
if ($pos !== false) {
echo "찾은 위치: $pos";
} else {
echo '찾을 수 없습니다.';
}
// 출력: 찾은 위치: 17 <= 원하지 않는 결과가 발생합니다.
UTF-8과 같은 멀티바이트 문자 인코딩에서는 문자 하나가 여러 바이트로 표현되기 때문에,
strrpos() 함수와 같이 문자열의 위치를 바이트 기준으로 계산하는 함수는 한글과 같은 문자열에서 예상치 못한 결과를 반환할 수 있습니다.
mb_srtrrpos() 함수로 strrpos() 함수의 한글 문제 해결
mb_strrpos() 함수는 한글과 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공하기 때문에 strrpos() 함수의 한글 문제를 해결할 수 있습니다.
알아두세요!
mb_strrpos() 함수는 strrpos() 함수를 대신해서 안전하게 multi-byte로 작동하게 하는 함수입니다.
구문
mb_strrpos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false
매개변수
$haystack |
검색 대상이 되는 문자열입니다. |
|---|---|
$needle |
검색할 문자열입니다.
|
$offset |
옵션. 검색을 시작할 0 기반의 인덱스입니다.
|
$encoding |
옵션. 문자열의 인코딩을 지정합니다.
기본값은 null이며, 생략하거나 null을 전달하면 내부 문자 인코딩 값이 사용됩니다.
|
반환 값
대상 문자열에서 인수로 전달된 문자열($needle)이 마지막으로 나타나는 위치(인덱스)를 반환합니다.
문자열 위치(인덱스)는 1이 아닌 0부터 시작한다는 점에 유의하세요.
주어진 문자열($needle)이 포함되어 있지 않으면 false를 반환합니다.
$offset 값이 검색 대상 문자열($haystack)의 길이를 초과하면 검색을 시작할 위치가 존재하지 않기 때문에 ValueError 예외가 발생합니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 8.0.0 | $needle에 빈 문자열('')을 허용합니다. |
| 8.0.0 | $encodng은 이제 null 값을 가질 수 있습니다. |
| 8.0.0 | $offset 위치에 세 번째 인수로 $encoding 값을 전달하던 이전 방식을 더 이상 지원하지 않습니다. |
활용 예제
- 파일명에서 확장자 구분자(.)의 위치를 찾을 때 (예:
image.test.png에서 마지막.위치 찾기) - 문자열에서 마지막 공백(
" ")의 위치를 찾아 마지막 단어를 추출하거나 문자열을 분리할 때 - 문자열에서 마지막 구분자의 위치를 찾을 때 (예: 쉼표나 특수문자로 구분된 데이터에서 마지막 항목을 분리할 때)
- URL 또는 파일 경로에서 마지막
/위치를 찾을 때
대표적인 예제를 통해 살펴보겠습니다.
Multi-byte가 포함된 파일명에서 확장자 추출하기
사용자가 업로드한 이미지 파일명에는 한글, 일본어, 중국어 등과 같은 multi-byte 문자열이 포함될 수 있습니다.
mb_strrpos() 함수는 이러한 파일명에서도 마지막 확장자 구분자(.)의 위치를 안전하게 찾을 수 있습니다.
$filename = '이미지.test.png'; // 멀티바이트 문자가 포함된 파일명
$dot_position = mb_strrpos($filename, '.', 0, 'UTF-8'); // 파일명에서 마지막 . 위치 찾기
if ($dot_position !== false) {
$extension = mb_substr($filename, $dot_position + 1); // 마지막 . 위치 바로 다음부터 끝까지의 문자열 추출하기
echo "파일 확장자: $extension";
} else {
echo '확장자를 찾을 수 없습니다.';
}
// 출력: 파일 확장자: png
코드 부연설명
mb_substr() 함수는 문자열에서 주어진 특정 위치부터 특정 길이만큼의 문자열을 잘라서 추출하는 함수입니다. multi-byte 문자열을 지원합니다.