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)
mb_strpos — Find position of first occurrence of string in a string
$haystack
, string $needle
[, int $offset = 0
[, string|null $encoding = null
]] ) : int|falseFinds position of the first occurrence of a string in a string.
Performs a multi-byte safe strpos() operation based on number of characters. The first character's position is 0, the second character position is 1, and so on.
haystackThe string being checked.
needle
The string to find in haystack. In contrast
with strpos(), numeric values are not applied
as the ordinal value of a character.
offsetThe search offset. If it is not specified, 0 is used. A negative offset counts from the end of the string.
encoding
Parametrul encoding reprezintă codificarea caracterelor.
Dacă el este omis, va fi utilizată valoarea internă a codificării caracterelor.
Returns the numeric position of
the first occurrence of needle in the
haystack string. If
needle is not found, it returns false.
| Versiune | Descriere |
|---|---|
| 8.0.0 |
encoding is nullable now.
|
| 7.1.0 |
Support for negative offsets has been added.
|
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