mb_ereg_search_init работает как однобайтовый? - PullRequest
1 голос
/ 05 февраля 2011

Проверьте этот фрагмент:

mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
mb_ereg_search_init('καλημέραCCC', 'C+');
$pos = mb_ereg_search_pos();
echo $pos[0];

(Пожалуйста, не комментируйте этот конкретный пример, это не мой случай использования, это уменьшение проблемы, с которой я столкнулся)

Несмотря на то, что строка «καλημέρα» состоит из 8 символов, фрагмент выше печатает 16. Я что-то упустил?Разве mb_ereg_search_init не должен поддерживать многобайтовые?И если да, есть ли встроенная функция, которая делает то, что мне нужно?

Заранее спасибо.

1 Ответ

0 голосов
/ 18 октября 2011

со страницы руководства для mb_ereg_search_pos:

Массив, включающий в себя положение совпадающей части для многобайтовой регулярное выражение. Первый элемент массива будет начало совпадающей части, второй элемент будет иметь длину ( байт ) согласованной части. Возвращает FALSE при ошибке.

Моя интерпретация заключается в том, что всегда возвращается количество байтов, а не фактическая позиция. Если вы проверите больше этих многобайтовых функций, есть хотя бы еще одна , которая намекает на то, что она должна работать таким образом. Тогда не спрашивайте меня, какова цель этой функции ...

Если вы хотите узнать только позицию первого C, вы можете использовать mb_strpos:

mb_strpos('καλημέραCCC', 'C'); // 8

Если вы хотите просто взломать его любой ценой, есть решение. Вы должны сначала декодировать строку:

mb_ereg_search_init(utf8_decode('καλημέραCCC'), 'C+');

Строка становится ????????CCC, каждый из вопросительных знаков занимает ровно 1 байт, и вы можете правильно их подсчитать. Однако, если вы хотите использовать многобайтовый символ в регулярном выражении сейчас ('λ+'), это не сработает.

...