Нещодавно робив допис про PHP розширення php_mbstring, що передує сьогоднішньому огляду. Я підняв питання однобайтових та багатобайтових кодувань, опрацювання кирилиці і навів кілька прикладів для наочної різниці. Однак я попередив, що далеко не всі аналогічні вбудованим рядковим PHP функціям включає в себе розширення «php_mbstring». Сьогодні якраз той випадок, коли нам потрібен аналог функції ucfirst, але, на жаль, його не включено в розширення.
Функція ucfirst() піднімає першу літеру в слові до верхнього регістра.
<?php echo ucfirst('hello'); // Змінить регістр першої літери на верхній і виведе «Hello» ?>
<?php echo ucfirst('привіт'); // Не змінить регістр першої літери на верхній і виведе «привіт» ?>
Також маю підозру, що ви одразу спробуєте чи вже спробували наступний код:
<?php echo mb_ucfirst(‘привіт’); ?>
І, звісно ж, отримаєте помилку — Fatal error: uncaught error call to undefined function mb_ucfirst()
Адже, як я казав раніше, функція mb_ucfirst() не існує в розширені php_mbstring. Так, це доволі дивно, чому така затребована функція не увійшла в розширення, натомість присутні щонайменше кілька функцій, які ніхто не використовує зовсім. Але маємо, що маємо, тож доведеться написати самому. Далі я наводжу дві реалізації, що більш всього імпонують моєму стилю програмування.
<?php function mb_ucfirst($string, $encoding = null) { $first = mb_substr($string, 0, 1, $encoding); // перший символ рядка $last = mb_substr($string, 1, null, $encoding); // решта рядка (окрім першого символу) return mb_strtoupper($first, $encoding) . $last; // піднімаємо перший символ у верхній регістр і формуємо фінальний рядок } ?>
<?php function mb_ucfirst($string, $encoding = null){ preg_match_all("~^(.)(.*)$~u", $string, $arr); // пошук і збереження першого символу та залишку рядка в масиві $arr return mb_strtoupper($arr[1][0], $encoding). $arr[2][0]; // піднімаємо перший символ у верхній регістр і формуємо фінальний рядок } ?>