정의 및 사용 방법
- PHP 버전
- 5.2+
mb_stripos() 함수는
문자열에서 특정 문자열의 위치를 찾는 함수입니다.
이 함수는 stripos() 함수와 거의 동일한 기능을 하지만, 한글, 일본어, 중국어와 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공한다는 큰 차이점이 있습니다.
특징
- multi-byte(멀티바이트)를 지원합니다.
- 대상 문자열에서 주어진 문자열이 처음 나타나는 위치(인덱스)를 반환합니다.
- 주어진 문자열이 포함되어 있지 않으면
false를 반환합니다. - 대소문자를 구분하지 않습니다.
기본 예제
$haystack = '안녕하세요, PHP mb_stripos() 함수 예제입니다.';
$needle = 'php';
$position = mb_stripos($haystack, $needle);
if ($position !== false) {
echo "부분 문자열이 발견된 위치: $position";
} else {
echo '부분 문자열이 발견되지 않았습니다.';
}
// 출력: 부분 문자열이 발견된 위치: 7
/*
* 주의하세요!
* 문자열에서 인덱스는 0부터 시작합니다.
* 첫 번째 문자열의 인덱스는 0이고, 두 번째 문자열의 인덱스는 1입니다.
*/
한글에서 stripos() 함수의 문제점
stripos() 함수는 한글과 같은 multi-byte 문자열을 지원하지 않아 원하지 않는 결과가 발생합니다.
영어, 숫자 등은 1 byte이지만, 한글, 일본어, 중국어 등은 2 byte 이상입니다. 2 byte 이상의 바이트로 표현되는 것을 "multi-byte(멀티바이트)"라고 합니다.
$haystack = '안녕하세요, PHP mb_stripos() 함수 예제입니다.';
$needle = 'php';
$position = stripos($haystack, $needle);
if ($position !== false) {
echo "부분 문자열이 발견된 위치: $position";
} else {
echo '부분 문자열이 발견되지 않았습니다.';
}
// 출력: 부분 문자열이 발견된 위치: 17 <= 원하지 않는 결과가 발생합니다.
UTF-8과 같은 멀티바이트 문자 인코딩에서는 문자 하나가 여러 바이트로 표현되기 때문에, stripos() 함수와 같이 일반적인 바이트 수를 그대로 사용하여 문자열을 자르는 것은 예상치 못한 결과를 초래할 수 있습니다.
mb_stripos() 함수로 stripos() 함수의 한글 문제 해결
mb_stripos() 함수는 한글과 같은 multi-byte 문자열에서 안전하게 작동하는 기능을 제공하기 때문에 stripos() 함수의 한글 문제를 해결할 수 있습니다.
알아두세요!
mb_stripos() 함수는 stripos() 함수를 대신해서 안전하게 multi-byte로 작동하게 하는 함수입니다.
구문
mb_stripos(
string $haystack,
string $needle,
int $offset = 0,
?string $encoding = null
): int|false
매개변수
$haystack |
검색 대상이 되는 문자열입니다. |
|---|---|
$needle |
검색할 문자열입니다.
|
$offset |
옵션. 검색을 시작할 0 기반의 인덱스입니다.
|
$encoding |
옵션. 문자열의 인코딩을 지정합니다.
기본 값은 null이며, UTF-8과 같은 표준 인코딩을 사용할 경우에는 별도로 지정하지 않아도 됩니다. 생략하거나 null이면 내부 문자 인코딩 값이 사용됩니다. |
반환 값
대상 문자열에서 주어진 문자열($needle)이 처음 나타나는 위치(인덱스)를 반환합니다.
문자열 위치는 1이 아닌 0부터 시작한다는 점에 유의하세요.
주어진 문자열($needle)이 포함되어 있지 않으면 false를 반환합니다.
변경 이력
| 버전 | 설명 |
|---|---|
| 8.0.0 | $needle에 빈 문자열('')을 허용합니다. |
| 8.0.0 | $encodng은 이제 null 값을 가질 수 있습니다. |
| 7.1.0 | $offset에 음수를 전달할 수 있게 되었습니다. |
주의할 점
mb_stripos() 함수는 대소문자를 구분하지 않습니다.
만약 대소문자를 구분해서 사용하려면 mb_strpos() 함수를 사용하세요.
문자열에서 인덱스는 0부터 시작합니다.
첫 번째 문자열의 인덱스는 0이고, 두 번째 문자열의 인덱스는 1입니다.
$newstring = '가나다라 마바사';
$pos = mb_stripos($newstring, '가');
var_dump($pos); // int(0)
이 함수를 Boolean 타입으로 반환 값을 사용할 때에는 주의가 필요합니다.
이 함수의 반환 값을 테스트하려면 === 연산자를 사용하세요 .
mb_stripos() 함수는 반환 값으로 대상 문자열에서 주어진 문자열이 처음 나타나는 위치(인덱스)를 반환합니다. 문자열 위치는 1이 아닌 0부터 시작한다는 점에 유의해야 합니다.
대상 문자열에서 주어진 문자열의 위치가 첫 번째에 위치하고 있다고 가정해 보겠습니다.
이 경우 반환 값은 0이 됩니다.
0은 == 연산자로 변환하면 false를 반환하게 됩니다.
실제 주어진 문자열이 존재하지만 false를 반환하기 때문에 부울(boolean) 타입으로 반환 값을 테스트하려면 엄격한 타입 비교가 수행되어 하기 때문에 === 연산자를 사용해야 합니다.
Boolean 타입으로 반환 값을 사용할 때에는 === 연산자를 사용하세요 .
$newstring = '가나다라 마바사';
$pos = mb_stripos($newstring, '가');
var_dump($pos); // int(0)
if ($pos === false) {
echo "문자열에 '가'를 찾을 수 없습니다.";
} else {
echo "문자열에 '가'가 포함되어 있습니다.";
}
// 출력: "문자열에 '가'가 포함되어 있습니다."
PHP 8 이전의 버전에서는 검색할 문자열에 빈 문자열('')을 허용하지 않습니다.
'')을 허용하지 않습니다.
$newstring = '가나다라 마바사';
$substring = '';
$pos = mb_stripos($newstring, $substring); // Warning: mb_stripos(): Empty delimiter in
같이 보기
- PHP stripos() 함수 – 대소문자를 구분 없이 문자열에 특정 문자 포함 여부 확인
- PHP mb_strpos() 함수 – strpos()의 한글 지원 기능 제공
- PHP mb_substr() 함수 – substr()의 한글 깨짐을 해결하기
- PHP mb_strlen() 함수 - 한글 문자열 길이 확인
- PHP str_contains() 함수 – 대소문자 구분해서 특정 문자열 포함 확인
- PHP str_starts_with() 함수 – 특정 문자열로 시작하는지 체크
- PHP str_ends_with() 함수 – 특정 문자열로 끝나는지 체크