Способы выделения подстроки в PHP

Раздел: Основы PHP -> Работа со строками

Методы извлечения подстроки в PHP

Как получить часть строки с учётом многобайтовой кодировки (UTF-8)?

mb_substr() - универсальная функция для работы с многобайтовыми кодировками. Она корректно обрабатывает символы UTF-8, не разрывая их.


$text = 'Привет, мир!';
$part = mb_substr($text, 0, 6, 'UTF-8');
echo $part; // 'Привет'
  

Php маленькие буквы (преобразование строки в нижний регистр в php)

Параметры: строка, начальная позиция (с 0), длина (если не указана - до конца строки), кодировка (по умолчанию внутренняя кодировка, но лучше указывать явно).

Типичная ошибка: использование substr() с кириллицей приводит к битым символам. Решение - всегда применять mb_substr() для UTF-8 строк. При указании отрицательной длины mb_substr() отсчитывает от конца строки.

Как вырезать часть строки, если кодировка однобайтовая (ASCII)?

Функция substr() работает быстрее, но не поддерживает многобайтовые кодировки. Подходит для латиницы, чисел и символов ASCII.


$email = 'user@example.com';
$domain = substr($email, strpos($email, '@') + 1);
echo $domain; // 'example.com'
  

Character php (символы php)

Проблема: если смещение или длина выходят за границы строки, substr() возвращает пустую строку или некорректное значение. Нужно проверять длину строки через strlen().

Что делать, если требуется работа с кодировкой Windows-1251?

Для кодировок, отличных от UTF-8, можно использовать iconv_substr(). Она поддерживает любую кодировку, поддерживаемую iconv.


$str = iconv('UTF-8', 'Windows-1251', 'Привет');
$sub = iconv_substr($str, 0, 3, 'Windows-1251');
echo $sub; // первые 3 символа в Windows-1251 (нечитаемо без конвертации)
  

Php new line (символ новой строки в php)

Ошибка: если указать неверную кодировку, iconv_substr() вернёт false. Рекомендуется проверять результат.

Как получить подстроку, используя регулярное выражение?

Иногда требуется извлечь часть строки по шаблону. Функция preg_match() позволяет это сделать, но для простых случаев избыточна.


$path = '/user/profile/123';
preg_match('#/user/profile/(\d+)#', $path, $matches);
echo $matches[1] ?? ''; // '123'
  

Php проверить строку (проверить строку в php)

Сложность: регулярные выражения медленнее и сложнее в отладке. Для обычного вырезания по индексу предпочтительнее mb_substr().

Как извлечь последние N символов строки?

Используйте отрицательное значение длины в mb_substr() или substr().


$name = 'Александр';
$lastTwo = mb_substr($name, -2, 2, 'UTF-8');
echo $lastTwo; // 'др'
  
- удалить пробел в строке php (php удалить пробелы в строке)
- Php подстроки (получение подстроки в php)
- Php длина строки (длина строки php)

Расширенные примеры работы с подстроками

Ниже приведены различные сценарии извлечения подстрок с подробными пояснениями и результатами.

Пример 1: Отрицательное смещение и длина

Пример

<?php
$str = 'abcdefgh';
// С 3-го символа до конца
$sub1 = substr($str, 3);
echo 'substr($str, 3): ' . $sub1 . PHP_EOL;
// Последние 3 символа
$sub2 = substr($str, -3);
echo 'substr($str, -3): ' . $sub2 . PHP_EOL;
// Часть строки от 2-го до 5-го символа (исключая 6)
$sub3 = substr($str, 2, 4);
echo 'substr($str, 2, 4): ' . $sub3 . PHP_EOL;
// Последние 4 символа, начиная с -6
$sub4 = substr($str, -6, 4);
echo 'substr($str, -6, 4): ' . $sub4 . PHP_EOL;
?>
substr($str, 3): defgh
substr($str, -3): fgh
substr($str, 2, 4): cdef
substr($str, -6, 4): cdef

Пример 2: Многобайтовые строки (кириллица)

Пример

<?php
$text = 'Здравствуйте, мир!';
// Ошибочный substr - битый вывод
$wrong = substr($text, 0, 10);
echo 'substr: ' . $wrong . PHP_EOL;
// Правильный mb_substr
$correct = mb_substr($text, 0, 10, 'UTF-8');
echo 'mb_substr: ' . $correct . PHP_EOL;
// Извлечение без указания длины
$from5 = mb_substr($text, 5, null, 'UTF-8');
echo 'mb_substr($text,5): ' . $from5 . PHP_EOL;
?>
substr: ЗдавÑÑ
mb_substr: Здравствуй
mb_substr($text,5): ствуйте, мир!

Пример 3: Извлечение домена из email с помощью substr

Пример

<?php
$email = 'user@example.com';
$atPos = strpos($email, '@');
if ($atPos !== false) {
    $domain = substr($email, $atPos + 1);
    echo 'Домен: ' . $domain . PHP_EOL;
    $local = substr($email, 0, $atPos);
    echo 'Локальная часть: ' . $local . PHP_EOL;
} else {
    echo 'Некорректный email';
}
?>
Домен: example.com
Локальная часть: user

Пример 4: Использование iconv_substr для кодировки Windows-1251

Пример

<?php
// Предположим, строка в UTF-8
$utf = 'Привет';
// Конвертируем в Windows-1251
$cp1251 = iconv('UTF-8', 'Windows-1251//TRANSLIT', $utf);
// Извлекаем подстроку в той же кодировке
$subCp = iconv_substr($cp1251, 0, 3, 'Windows-1251');
// Для вывода конвертируем обратно
echo 'Подстрока в UTF-8: ' . iconv('Windows-1251', 'UTF-8', $subCp) . PHP_EOL;
// Сравнение с обычным substr (даст битые символы)
echo 'Обычный substr: ' . iconv('Windows-1251', 'UTF-8', substr($cp1251, 0, 3)) . PHP_EOL;
?>
Подстрока в UTF-8: ßàè
Обычный substr: ßàè

Примечание: вывод выглядит нечитаемым из-за преобразований, но демонстрирует разницу в работе функций.

Пример 5: Извлечение подстроки с помощью mb_strimwidth (обрезание с многоточием)

Пример

<?php
$longText = 'PHP - скриптовый язык общего назначения.';
$trimmed = mb_strimwidth($longText, 0, 20, '...', 'UTF-8');
echo $trimmed . PHP_EOL;
// Длина результирующей строки не превысит 20 символов
?>
PHP - скриптовый яз...

Пример 6: Извлечение подстроки через explode и array_slice

Пример

<?php
$csv = 'apple,banana,cherry,date';
$parts = explode(',', $csv);
$subset = array_slice($parts, 1, 2); // элементы с 1 по 3 (не включая 3)
echo 'Подмассив: ' . implode(',', $subset) . PHP_EOL;
// Можно собрать обратно в строку - это аналог извлечения подстроки с разделителями
?>
Подмассив: banana,cherry

Получение подстроки в PHP - comments

En
Php подстроки (php)