Получение первых символов строки в PHP: практическое руководство
Способы получения первых символов строки
Задача извлечения первых символов из строки часто встречается при обработке текстов, сокращении заголовков, проверке префиксов. В зависимости от кодировки и требуемого числа символов выбирается подходящий метод.
Как получить первые N символов строки с учётом многобайтовых кодировок?
Наиболее надёжное и универсальное решение - использование функции mb_substr. Она корректно работает с UTF-8 и другими многобайтовыми кодировками. Для однобайтовых кодировок (например, Windows-1251) подходит substr.
$string = "Привет, мир!";
$first5 = mb_substr($string, 0, 5, 'UTF-8');
echo $first5; // "Приве"
// substr без указания кодировки может дать некорректный результат
$first5_wrong = substr($string, 0, 5);
echo $first5_wrong; // может вывести обрывки байтовPhp маленькие буквы (преобразование строки в нижний регистр в php)
Типичная ошибка: использование substr с многобайтовой строкой приводит к повреждению символов. Решение - всегда применять mb_substr с указанием кодировки, если данные содержат не-ASCII символы.
Как получить только первый символ без вызова функций?
Можно обратиться к строке как к массиву: $str[0]. Этот способ возвращает первый байт, поэтому для многобайтовых строк он не годится (вернёт только первое байтовое значение).
$str = "Hello";
echo $str[0]; // H
$str_utf = "Привет";
echo $str_utf[0]; // выведет часть байта (не "П")Character php (символы php)
Ошибка: при использовании индексного доступа с многобайтовыми строками результат будет некорректным. Рекомендуется применять mb_substr($str, 0, 1).
Как получить первые символы в виде массива с помощью str_split?
Функция str_split разбивает строку на массив символов (по одному байту). Для работы с многобайтовыми кодировками необходимо использовать mb_str_split (PHP 7.4+). Далее можно взять нужное количество элементов через array_slice.
$str = "Привет";
$chars = mb_str_split($str, 1, 'UTF-8');
$first3 = array_slice($chars, 0, 3);
echo implode('', $first3); // "При"
Php new line (символ новой строки в php)
Недостаток: для длинных строк создание всего массива неэффективно. Лучше пользоваться mb_substr.
Как использовать регулярные выражения для извлечения первых символов?
Регулярное выражение /^.{N}/u с модификатором u (UTF-8) позволяет получить первые N символов. Однако такой подход медленнее и избыточен для простой задачи.
$str = "Hello, world!";
preg_match('/^.{5}/', $str, $match);
echo $match[0]; // "Hello"Php проверить строку (проверить строку в php)
Проблема: при отсутствии модификатора u многобайтовые символы будут обрабатываться неправильно. Регулярные выражения требуют дополнительной памяти и времени на компиляцию.
Какая альтернатива mb_substr существует для других кодировок?
Функция iconv_substr из расширения iconv позволяет обрезать строку в заданной кодировке. Она работает аналогично mb_substr, но требует установленного расширения iconv.
$str = "Привет";
$first3 = iconv_substr($str, 0, 3, 'UTF-8');
echo $first3; // "При"
Ошибка: если расширение iconv не включено, вызов приведёт к фатальной ошибке. На серверах обычно предпочитают mb_substr как более распространённое решение.
Расширенные примеры получения первых символов
Сравнение substr и mb_substr для строки с эмодзи
Эмодзи занимают несколько байт в UTF-8. Покажем разницу:
$emoji = "???";
echo "substr(0,2): " . substr($emoji, 0, 2) . "\n";
echo "mb_substr(0,2): " . mb_substr($emoji, 0, 2, 'UTF-8') . "\n";
substr(0,2): ?? mb_substr(0,2): ??
Результат: substr выводит искажённые байты, mb_substr корректно извлекает два эмодзи.
Обрезка с проверкой длины строки
Чтобы избежать ошибок при пустой строке, проверяем длину:
$str = "PHP";
$n = 5;
$result = (mb_strlen($str, 'UTF-8') >= $n) ? mb_substr($str, 0, $n, 'UTF-8') : $str;
echo $result; // "PHP" (строка короче 5 символов)
PHP
Динамическое количество символов из переменной
Часто число символов задаётся динамически, например, из конфигурации:
$title = "Краткое описание статьи";
$max_len = intval($_GET['len'] ?? 10);
$short = mb_substr($title, 0, $max_len, 'UTF-8');
echo $short;
Создание безопасной функции для обрезки с многоточием
Функция, которая обрезает строку до N символов и добавляет многоточие, если строка была длиннее:
function truncate(string $text, int $limit, string $encoding = 'UTF-8'): string {
if (mb_strlen($text, $encoding) <= $limit) {
return $text;
}
return mb_substr($text, 0, $limit, $encoding) . '...';
}
echo truncate('Длинная строка для обрезки', 10); // "Длинная ст..."
Получение первых байт без учёта кодировки
Если требуется обработать сырые бинарные данные, используют substr:
$binary = pack('H*', '48656c6c6f'); // "Hello"
$first3_bytes = substr($binary, 0, 3);
echo bin2hex($first3_bytes); // 48656c
Извлечение первых символов из строки с символами разной ширины (CJK)
Китайские и японские символы также занимают несколько байт. mb_substr обрабатывает их корректно:
$japanese = "日本語テスト";
$first2 = mb_substr($japanese, 0, 2, 'UTF-8');
echo $first2; // "日本"
日本