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 — Поиск позиции первого вхождения одной строки в другую
$haystack
,$needle
,$offset
= 0,$encoding
= null
Ищет позицию первого вхождения одной строки string в другую строку string.
Выполняет безопасную с точки зрения многобайтных кодировок операцию strpos(), которая опирается на число символов в строке. Первый символ стоит на позиции 0, позиция второго 1 и так далее.
haystack
Строка string в которой производится поиск.
needle
Строка, поиск которой производится в строке
haystack
. В отличие от
strpos(), числовые значения не применяются в качестве
порядковых номеров символов.
offset
Смещение начала поиска. Если не задан, используется 0. Если значение отрицательно, отсчёт идёт с конца строки.
encoding
Параметр encoding
представляет собой символьную кодировку. Если он опущен или равен null
, вместо него будет использовано значение внутренней кодировки.
Возвращает число - позицию первого вхождения строки
needle
в строку haystack
string. Если строка needle
не найдена,
функция вернёт false
.
Версия | Описание |
---|---|
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