Многобайтовое регулярное выражение PHP не работает с UTF-8Php

Кемеровские программисты php общаются здесь
Anonymous
Многобайтовое регулярное выражение PHP не работает с UTF-8

Сообщение Anonymous »

У меня есть строка UTF-8, в которой я хочу найти все вхождения img_(\d+).
Я пробовал оригинал

Код: Выделить всё

$pattern = '/img_(\d+)/u';
preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
но это дает мне неправильные смещения для шаблонов.
Я тоже пробовал:

Код: Выделить всё

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]),
];
}
но он дает тот же результат, что и preg_match_all.
Однако, когда я запускаю поиск вручную с помощью этого:

Код: Выделить всё

$pos = mb_strpos($content, "img_1", 0);
Я получил правильное смещение.
Пример кода:

Код: Выделить всё

$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)
Как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/785 ... with-utf-8

Вернуться в «Php»