Eu tenho uma string UTF-8 que desejo pesquisar todas as ocorrências de img_(\d+)
. Eu tentei original
$pattern = '/img_(\d+)/u';
preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
mas isso me dá compensações erradas para os padrões.
Eu também tentei:
mb_internal_encoding('UTF-8');
$pattern = 'img_(\d+)';
mb_ereg_search_init($content, $pattern);
$matches = [];
while ($result = mb_ereg_search_regs()) {
$matches[] = [
'match' => $result[0],
'offset' => mb_ereg_search_getpos() - mb_strlen($result[0]),
];
}
mas me dá o mesmo resultado que preg_match_all
.
No entanto, quando executo manualmente a pesquisa com isto:
$pos = mb_strpos($content, "img_1", 0);
Eu obtive o deslocamento correto.
Código de exemplo:
$str = "příliš žluťoučký img_1 kůn úpěl ďábelské ódy";
$pattern = '/img_(\d+)/u';
preg_match_all($pattern, $str, $matches, PREG_OFFSET_CAPTURE);
print_r($matches); //gives 24 (wrong)
echo mb_strpos($str, "img_1", 0); //gives 17 (correct)
Como consertar isto?
A
preg_match_all()
função parece funcionar conforme pretendido, de acordo com a documentação :Como retorna o deslocamento em bytes , a contagem de caracteres acentuados para 2 e 24 é o valor correto.
Se você ainda precisar obter o "deslocamento multibyte" , ainda poderá extrair a primeira parte da string usando o deslocamento de bytes e depois contar os caracteres: