정의 및 사용 방법
- PHP 버전
- 5.2+
mb_strripos() 함수는
문자열에서 인수로 전달된 문자열을 찾아 마지막으로 검색된(나타나는) 위치의 인덱스를 반환합니다.
대소문자를 구분하지 않으며, 한글과 같은 multi-byte 문자열에서 안전하게 작동합니다.
인수로 전달된 문자열을 찾을 수 없다면 false를 반환합니다.
이 함수는 strripos() 함수와 거의 동일한 기능을 하지만,
한글, 일본어, 중국어와 같은 multi-byte 문자열을 안전하게 처리할 수 있다는 큰 차이점이 있습니다.
UTF-8 인코딩에서 영어와 숫자 같은 ASCII 문자는 1 byte로 표현되지만, 한글이나 일본어, 중국어 등은 여러 byte를 사용합니다.
이처럼 하나의 문자를 표현하기 위해 2 byte 이상을 사용하는 문자를 multi-byte(멀티바이트) 문자열이라고 합니다.
특징
- 대소문자를 구분하지 않습니다.
- multi-byte(멀티바이트)를 지원합니다.
기본 예제
mb_strripos() 함수는 문자열 내에 대소문자가 다른 알파벳 패턴과 한글과 같은 multi-byte 문자열이 섞여 있는 경우, 대소문자 구분 없이 특정 문자열이 마지막으로 나타나는 위치를 대소문자 구분 없이 찾을 때 매우 유용합니다.
$str_filename = 'image.테스트.PNG'; // 한글과 같은 multi-byte 문자열이 섞어 있는 파일명
$extension = '.png'; // 대소문자 구분 없이 찾을 확장자(예:.PNG와 .png 같은 경우)
$extension_position = mb_strripos($str_filename, $extension, 0, 'UTF-8');
if ($extension_position !== false) {
echo "찾은 위치: $extension_position";
} else {
echo '확장자를 찾을 수 없습니다.';
}
// 출력: 찾은 위치: 9
/*
* 주의하세요!
* 문자열에서 인덱스는 0부터 시작합니다.
* 첫 번째 문자의 인덱스는 0이고, 두 번째 문자의 인덱스는 1입니다.
*/
한글에서 strripos() 함수의 문제점
strripos() 함수는 한글과 같은 multi-byte 문자열을 지원하지 않아 원하지 않는 결과가 발생합니다.
$str = '환영합니다. PHP입니다. 즐거운 php';
$substring = 'PHP';
$position = strripos($str, $substring);
if ($position !== false) {
echo "부분 문자열이 발견된 위치: $position";
} else {
echo '부분 문자열이 발견되지 않았습니다.';
}
// 출력: 부분 문자열이 발견된 위치: 41 <= 원하지 않는 결과가 발생합니다.
UTF-8과 같은 멀티바이트 문자 인코딩에서는 문자 하나가 여러 바이트로 표현되기 때문에, strripos() 함수와 같이 일반적인 바이트 수를 그대로 사용하여 문자열을 자르는 것은 예상치 못한 결과를 초래할 수 있습니다.
mb_strripos() 함수로 strripos() 함수의 한글 문제 해결
mb_strripos() 함수는 한글과 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공하기 때문에 strripos() 함수의 한글 문제를 해결할 수 있습니다.
알아두세요!
mb_strripos() 함수는 strripos() 함수를 대신해서 안전하게 multi-byte로 작동하게 하는 함수입니다.
구문
mb_strripos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false
매개변수
$haystack |
검색 대상이 되는 문자열입니다. |
|---|---|
$needle |
검색할 문자열입니다.
|
$offset |
옵션. 검색을 시작할 0 기반의 인덱스입니다.
|
$encoding |
옵션. 문자열의 인코딩을 지정합니다.
기본값은 null이며, 생략하거나 null을 전달하면 내부 문자 인코딩 값이 사용됩니다.
|
반환 값
대상 문자열에서 인수로 전달된 문자열($needle)이 마지막으로 나타나는 위치(인덱스)를 반환합니다.
문자열 위치(인덱스)는 1이 아닌 0부터 시작한다는 점에 유의하세요.
$offset 값이 검색 대상 문자열($haystack)의 길이를 초과하면 검색을 시작할 위치가 존재하지 않기 때문에 ValueError 예외가 발생합니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 8.0.0 | $needle에 빈 문자열('')을 허용합니다. |
| 8.0.0 | $encodng은 이제 null 값을 가질 수 있습니다. |
주의할 점
mb_strripos() 함수는 대소문자를 구분하지 않습니다.
만약 대소문자를 구분해서 사용하려면 mb_strrpos() 함수를 사용하세요.
문자열에서 인덱스는 0부터 시작합니다.
첫 번째 문자열의 인덱스는 0이고, 두 번째 문자열의 인덱스는 1입니다.
$newstring = '가나다라 마바사';
$pos = mb_strripos($newstring, '가', 0, 'UTF-8');
var_dump($pos); // int(0)
mb_strripos() 함수의 반환 값을 조건식에서 사용할 때에는 주의가 필요합니다.
이 함수는 문자열의 위치를 정수로 반환하며, 첫 번째 위치에 문자열이 존재하는 경우 반환 값은 0입니다.
PHP에서 0은 느슨한 비교(==)에서 false로 평가되므로, 반환 값을 확인할 때는 엄격한 타입 비교 연산자인 === 또는 !==를 사용해야 합니다.
대상 문자열에서 주어진 문자열의 위치가 첫 번째에 위치하고 있다고 가정해 보겠습니다.
이 경우 반환 값은 0이 됩니다.
0은 == 연산자로 평가하면 false를 반환하게 됩니다.
실제 주어진 문자열이 존재하지만 false를 반환하기 때문에 부울(boolean) 타입으로 반환 값을 평가하려면 엄격한 타입 비교가 수행되어 하기 때문에 === 연산자를 사용해야 합니다.
$newstring = '가나다라 마바사';
$pos = mb_strripos($newstring, '가', 0, 'UTF-8');
var_dump($pos); // int(0)
if ($pos === false) {
echo "문자열에 '가'를 찾을 수 없습니다.";
} else {
echo "문자열에 '가'가 포함되어 있습니다.";
}
// 출력: "문자열에 '가'가 포함되어 있습니다."
/* 또는 */
if ($pos !== false) {
echo "문자열에 '가'가 포함되어 있습니다.";
} else {
echo "문자열에 '가'를 찾을 수 없습니다.";
}
// 출력: "문자열에 '가'가 포함되어 있습니다."