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 — Repère la première occurrence d'un caractère dans une chaîne
Repère la position de la première occurrence d'un caractère dans la chaîne fournie.
Effectue une recherche de type
strpos(), en tenant compte des caractères
multioctets. La position de needle
est comptée
à partir du début de la chaîne haystack
: les
positions commencent à 0.
haystack
La chaîne à analyser.
needle
La chaîne de caractères à trouver dans le paramètre
haystack
. A contrario de la
fonction strpos(), les valeurs numériques
ne sont pas appliquées comme valeur ordinale d'un caractère.
offset
La position de début de recherche. S'il est omis, zéro sera utilisé. Une position négative compte à partir de la fin de la chaîne de caractères.
encoding
Le paramètre encoding
est l'encodage des caractères. S'il est omis ou null
, l'encodage de caractères interne
sera utilisé.
Retourne la position numérique de
la première occurrence du caractère needle
dans la
chaîne haystack
. Si needle
est
introuvable, mb_strpos() retourne false
.
Version | Description |
---|---|
8.0.0 |
needle accepte désormais une chaîne vide.
|
8.0.0 |
encoding est désormais nullable.
|
7.1.0 |
Support pour offset s négatifs a été ajouté.
|
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