PHP

Дополнительные функции mb_string

Как известно строковые функции PHP не правильно работают с русским текстом в кодировке UTF-8. Чтобы решить эту проблему предполагается использовать функции mb_string, но тут проблема полностью не решается т.к. некоторых функций в нем нет. Далее представлены недостающие функции и примеры их работы.

mb_ucfirst - первый символ строки в верхний регистр

Мультибайтовый аналог функции ucfirst().

if (!function_exists('mb_ucfirst')) {
    function mb_ucfirst($str, $enc = 'utf-8') {
        return
            mb_strtoupper(mb_substr($str, 0, 1, $enc), $enc) .
            mb_substr($str, 1, mb_strlen($str, $enc), $enc);
    }
}

Пример:

echo ucfirst('русский текст');    // русский текст
echo mb_ucfirst('русский текст'); // Русский текст

mb_substr_replace - заменить часть строки

Мультибайтовый аналог функции substr_replace().

if (!function_exists('mb_substr_replace')) {
    function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null) {
        if ($encoding == null) {
            $encoding = mb_internal_encoding();
        }

        if ($length == null) {
            return mb_substr($string, 0, $start, $encoding) . $replacement;
        } else {
            if ($length < 0) {
                $length = mb_strlen($string, $encoding) - $start + $length;
            }

            return
                mb_substr($string, 0, $start, $encoding) .
                $replacement .
                mb_substr($string, $start + $length, mb_strlen($string, $encoding), $encoding);
        }
    }
}

Пример:

echo substr_replace('Предложение на русском языке', 'английском', 15, 7); 
// Предлож�английском на русском языке

echo mb_substr_replace('Предложение на русском языке', 'английском', 15, 7); 
// Предложение на английском языке

mb_invert_case - инвертировать регистр

function mb_invert_case($s) {
    $o = '';

    foreach (preg_split('/(?<!^)(?!$)/u', $s) as $v) {
        $o .= (mb_strtolower($v) === $v) ? mb_strtoupper($v) : mb_strtolower($v);
    }

    return $o;
}

Пример:

echo mb_invert_case('предложение'); // ПРЕДЛОЖЕНИЕ
echo mb_invert_case('ПРЕДЛОЖЕНИЕ'); // предложение
18 декабря 2016