mb_strpos() used in a loop on a long string may become very slow even if you provide the $offset. Unlike strpos(), mb_strpos() has to skip the number of characters
every call specified by $offset to get the real byte position used internally. (Whereas strpos can just add the offset.)
If your encoding is UTF-8 and you try to find only single characters with ordinal <= 127 you may still use strpos(), substr(), ... This works cause every byte of a UTF-8 sequence is >= 128.
Greetz maz
mb_strpos
(PHP 4 >= 4.0.6, PHP 5)
mb_strpos — Busca la posición de la primera ocurrencia de un string en otro string
Descripción
$haystack
, string $needle
[, int $offset = 0
[, string $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.
Parámetros
-
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
encodinges la codificación de caracteres. Si es omitido, será usado el valor de la codificación de caracteres interna.
Valores devueltos
Devuelve la posición numéricia de
la primera ocurrencia de needle en el
string haystack. Si
no se encuentra needle, devuelve FALSE.
Ver también
- mb_internal_encoding() - Establece/obtiene la codificación de caracteres interna
- strpos() - Encuentra la posición de la primera ocurrencia de un substring en un string
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
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;
}
It appears that the $offset value is a character count not a byte count. (This may seem obvious but it isn't explicitly stated)
Hello,
Just replaced strpos() with mb_strpos() and now I am getting following error:
PHP Warning: mb_strpos() [<a href='function.mb-strpos'>function.mb-strpos</a>]: Empty delimiter
PHP version: 5.2.3
OS: Win XP Prof
Web Server: IIS
I checked your bugs and mentioned that mb_string functions have been fixed as of 5.2.0 but it does not seem to be the case (Bug #39400).
My code:
==============================================
$charOut = mb_substr($tmpStr, $tmpKey[0], 1);
$posOut = mb_strpos($charList, $charOut);
if ($posOut !== FALSE) {
// do something here
}
==============================================
