It appears that the $offset value is a character count not a byte count. (This may seem obvious but it isn't explicitly stated)
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_strpos — Ищет позицию первого вхождения подстроки в строку
Находит позицию первого вхождения подстроки (string) в строку (string).
Выполняет безопасную многобайтовую операцию strpos(), которая опирается на число символов в строке. Первый символ стоит на позиции 0, позиция второго 1 и так далее.
haystack
Строка (string), в которой функция будет искать подстроку.
needle
Подстрока, которую нужно найти в строке
haystack
. По сравнению
с функцией strpos(), эта функция не использует числовые значения
в качестве порядковых значений символов.
offset
Смещение начала поиска. Если не задан, принимает значение 0. Отрицательное смещение отсчитывается от конца строки.
encoding
Параметр encoding
—
это кодировка символов. Если он опущен или равен null
, для него будет установлена внутренняя кодировка символов.
Возвращает число — позицию первого вхождения подстроки
needle
в строку (string) haystack
.
Если подстрока needle
не найдена,
возвращает false
.
Версия | Описание |
---|---|
8.0.0 |
needle теперь принимает пустую строку.
|
8.0.0 |
Теперь параметр encoding может принимать значение null .
|
7.1.0 |
В параметре offset добавлена поддержка отрицательных значений.
|
It appears that the $offset value is a character count not a byte count. (This may seem obvious but it isn't explicitly stated)
a sample mb_str_replace function:
function mb_str_replace($haystack, $search,$replace, $offset=0,$encoding='auto'){
$len_sch=mb_strlen($search,$encoding);
$len_rep=mb_strlen($replace,$encoding);
while (($offset=mb_strpos($haystack,$search,$offset,$encoding))!==false){
$haystack=mb_substr($haystack,0,$offset,$encoding)
.$replace
.mb_substr($haystack,$offset+$len_sch,1000,$encoding);
$offset=$offset+$len_rep;
if ($offset>mb_strlen($haystack,$encoding))break;
}
return $haystack;
}
sorry, my previous post had an error. replace the 1000 with strlen($haystack) to handle strings longer than 1000 chars.
btw. This is an issue with the mbstring functions. you can't specify the $encoding without specifying a $length, thus this reduces the functionality of mb_substr compared to substr