Ненавижу PHP ;E

Главные вкладки

Аватар пользователя axel axel 30 ноября 2006 в 7:06

Ещё одна мелочь в копилку проблем PHP. Насколько всёже угрёбищно работает этот язык с юникодом. И это в новом PHP 5.

Вот абстрактный кусок кода:

<?php
mb_ereg_search_init($string, '[[:alpha:]]+');
$len = mb_strlen($string);
$location = mb_ereg_search_pos();
print_r($location);
?>

В $string - строка на русском в UTF-8. Для корректной работы с UTF-8 как можно видеть задействованы функции mbstring, не стал использовать override для них, вызвал явно. Первая функция инициирует поиск регвыражения в строке $string, ок, тут всё в порядке. Вторая получает длину строки - как и ожидаемо с учётом двухбайтовых русских символов, т.е. длина в символах, не в байтах. Дальше делаем поиск, который возвращает массив из двух элементов - смещение и длину найденного фрагмента. И вот тут эта зараза возвращает уже не смещение и длину в символах (работаем ведь со строкой), а значения в байтах! В руководстве правда это явно указано:

mb_ereg_search_pos() returns an array including position of matched part for multibyte regular expression. The first element of the array will be the beginning of matched part, the second element will be length (bytes) of matched part.

— но осмыслить это без обращения к мануалу удаётся не вдруг. Когда вызываешь строковые функции якобы ориентированные на юникод (расширение mbstring) и часть из них (как mb_strlen) выдаёт значения в символах, то выдача другой частью функций значений в байтах мягко говоря дезориентирует. Нет, ну не уроды, а? Очередной раз досадую, что Drupal написан именно на PHP Sad

Комментарии