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 — Busca la posición de la primera ocurrencia de un string en otro string
$haystack
,$needle
,$offset
= 0,$encoding
= mb_internal_encoding()Busca la posición de la primera ocurrencia de un string en otro string.
Realiza una operación strpos() segura multibyte basada en el número de caracteres. La posición del primer carácter es 0, la posición del segundo carácter es 1, etc.
haystack
El string a comprobar.
needle
El string a buscar en haystack
. A diferencia
de strpos(), los valores numéricos no se aplican
como el valor ordinal de un carácter.
offset
El índice de búsqueda. Si no se especifica se usará 0.
encoding
El parámetro encoding
es la codificación de caracteres. Si es omitido, será usado el valor de la
codificación de caracteres interna.
Devuelve la posición numéricia de
la primera ocurrencia de needle
en el
string haystack
. Si
no se encuentra needle
, devuelve false
.
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