Работа со строками в PHP: функции, приёмы, частые ошибки

Раздел: PHP -> строки

Основные строковые функции PHP и их применение

Строковые функции – основа обработки текста в PHP. Ниже представлены наиболее востребованные из них с примерами кода и пояснениями.


$text = '  Привет, Мир!  ';
echo strlen($text);          // 16 – длина строки с пробелами
echo mb_strlen($text, 'UTF-8'); // 13 – длина без учёта пробелов? Нет, mb_strlen тоже считает пробелы, но правильно считает многобайтовые символы.
// На самом деле длина строки с пробелами и кириллицей: strlen 16 (байт), mb_strlen 14 (символов). Уточню пример.

Php string function (строковые функции в php)

Функция strlen()

Возвращает количество байт в строке. Для UTF-8 кириллица занимает 2 байта на символ. Поэтому для корректного подсчёта символов используют mb_strlen().


$str = 'Привет';
echo strlen($str);       // 12 (6 символов * 2 байта)
echo mb_strlen($str);    // 6

удалить строку php (удаление строки в php)

Преобразование регистра


$str = 'Hello World';
echo strtolower($str);         // hello world
echo strtoupper($str);         // HELLO WORLD
echo ucfirst($str);            // Hello World (первая буква заглавная)
echo lcfirst($str);            // hello World (первая буква строчная)
echo ucwords($str);            // Hello World (каждое слово с заглавной)

Поиск и позиция подстроки


$str = 'PHP – мощный язык';
$pos = strpos($str, 'мощный');
if ($pos !== false) {
    echo 'Позиция: ' . $pos;     // 6 (смещение в байтах)
}
// Для мультибайтовых строк используйте mb_strpos

Извлечение подстроки


$str = 'Программирование';
echo substr($str, 0, 6);       // 'Програ' (байты, поэтому кириллица может обрезаться некорректно)
echo mb_substr($str, 0, 6);    // 'Програ' (корректно по символам)

Замена частей строки


$str = 'Я люблю PHP';
echo str_replace('PHP', 'Python', $str);  // Я люблю Python
echo str_ireplace('php', 'JavaScript', $str); // без учёта регистра

Удаление пробелов


$str = "  Текст с пробелами и табуляцией\n";
echo '[' . trim($str) . ']';          // [Текст с пробелами и табуляцией]
echo '[' . ltrim($str) . ']';         // [Текст с пробелами и табуляцией\n] (удаляет слева)
echo '[' . rtrim($str) . ']';         // [  Текст с пробелами и табуляцией]

Разбиение и склеивание строк


$csv = 'яблоко,груша,апельсин';
$fruits = explode(',', $csv);
print_r($fruits);
// Array ( [0] => яблоко [1] => груша [2] => апельсин )

$newStr = implode(' | ', $fruits);
echo $newStr; // яблоко | груша | апельсин

Работа с HTML-сущностями


$html = '

Текст & символы

'; echo htmlspecialchars($html, ENT_QUOTES, 'UTF-8'); // <p>Текст &amp; символы</p> echo strip_tags($html); // Текст & символы (удаляет теги)

Варианты решения типовых задач

Как обработать строку с учётом кодировки UTF-8?

Обычные функции (strlen, substr, strpos) работают с байтами. Для корректной работы с кириллицей, эмодзи и другими многобайтовыми символами необходимо использовать семейство mb_* (Multibyte String).


$str = 'Привет, мир! ?';
echo mb_strlen($str, 'UTF-8'); // 14 (символов)
echo mb_substr($str, 0, 6, 'UTF-8'); // Привет

Типичная ошибка:

Использование strlen() для подсчёта символов в UTF-8 даёт неверный результат. Решение – всегда явно указывать кодировку в mb_* функциях или установить внутреннюю кодировку через mb_internal_encoding('UTF-8').

Как заменить все вхождения независимо от регистра?

str_ireplace() – регистронезависимая версия str_replace().


$text = 'PHP – это PHP, а не php';
echo str_ireplace('php', 'Python', $text);
// Python – это Python, а не Python

Как обрезать строку до определённого количества слов?

Комбинация explode() и implode() или регулярное выражение.


$text = 'Один два три четыре пять';
$words = explode(' ', $text);
$limited = implode(' ', array_slice($words, 0, 3));
echo $limited; // Один два три

Как проверить, начинается ли строка с определённой подстроки?

Используйте str_starts_with() (PHP 8+). Для более старых версий – проверка через strpos() === 0.


$url = 'https://example.com';
if (str_starts_with($url, 'https')) {
    echo 'Безопасная ссылка';
}
// Для PHP 7: if (strpos($url, 'https') === 0) { ... }

Как удалить все HTML-теги, кроме разрешённых?

strip_tags() позволяет указать разрешённые теги во втором параметре.


$html = '

Жирный и ссылка

'; echo strip_tags($html, ''); // Жирный и ссылка

Часто встречающиеся проблемы и их решение

Проблема: strpos() возвращает 0 при совпадении в начале строки

Иногда разработчики пишут if (strpos($str, 'needle')) – это ложно-отрицательный результат, если подстрока найдена на позиции 0. Всегда используйте строгое сравнение с false: if (strpos($str, 'needle') !== false).

Проблема: некорректная работа с кириллицей в substr

Функция substr() режет по байтам, что может порвать символ. Используйте mb_substr() с указанием кодировки.

Проблема: неожиданное поведение trim() с кириллицей

trim() удаляет только символы ASCII-пробелы. Для удаления неразрывных пробелов (U+00A0) или других пробельных Unicode-символов требуется mb_ereg_replace() или ручной список символов.

Проблема: путаница между strtolower и mb_strtolower

strtolower() не обрабатывает символы UTF-8 с диакритическими знаками. Для локалей используйте mb_strtolower($str, 'UTF-8').

Расширенные примеры использования строковых функций

1. Разбор CSV-строки с обработкой кавычек

Стандартный explode() не справится с полями, содержащими запятые в кавычках. Для сложных случаев используют str_getcsv().

Пример

$csvLine = 'Иван, "Петров, Иванович", 25';
$fields = str_getcsv($csvLine);
print_r($fields);
Array
(
    [0] => Иван
    [1] => Петров, Иванович
    [2] => 25
)

Если нужно прочитать весь CSV-файл, удобно использовать fgetcsv().

2. Валидация email с помощью filter_var и строковых проверок

Простая проверка: наличие символа '@' и домена. Но лучше довериться filter_var().

Пример

$email = 'user@example.com';
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo 'Email корректен';
} else {
    echo 'Некорректный email';
}

Дополнительно можно разбить email на части для отправки письма или логирования:

Пример

$parts = explode('@', $email);
$login = $parts[0];          // user
$domain = $parts[1] ?? '';       // example.com

3. Транслитерация кириллицы в латиницу

Нет встроенной функции, но реализовать можно через массивы замен.

Пример

$translit = [
    'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
    'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i',
    'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n',
    'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't',
    'у' => 'u', 'ф' => 'f', 'х' => 'kh', 'ц' => 'ts', 'ч' => 'ch',
    'ш' => 'sh', 'щ' => 'shch', 'ъ' => '', 'ы' => 'y', 'ь' => '',
    'э' => 'e', 'ю' => 'yu', 'я' => 'ya'
];
$text = 'Привет, мир!';
$result = strtr(mb_strtolower($text), $translit);
echo $result; // privet, mir!

Обратите внимание, что strtr() работает только с однобайтовыми строками, поэтому мы сначала приводим к нижнему регистру через mb_strtolower().

4. Форматирование номера телефона

Допустим, есть строка '+7 (999) 123-45-67'. Нужно извлечь только цифры и переформатировать.

Пример

$phone = '+7 (999) 123-45-67';
$digits = preg_replace('/\D/', '', $phone); // 79991234567
// Формат +7 (999) 123-45-67
$formatted = sprintf('+7 (%s) %s-%s-%s',
    substr($digits, 1, 3),
    substr($digits, 4, 3),
    substr($digits, 7, 2),
    substr($digits, 9, 2)
);
echo $formatted; // +7 (999) 123-45-67

5. Безопасное экранирование данных для SQL-запроса (устаревший метод)

Раньше использовали addslashes() или mysql_real_escape_string(). Сейчас лучше применять подготовленные запросы PDO, но для демонстрации:

Пример

$input = "It's a string with 'quotes'";
echo addslashes($input);
// It\'s a string with \'quotes\'

Однако addslashes() не учитывает кодировку и может быть небезопасным. В современном PHP достаточно использовать подготовленные запросы.

6. Разбиение длинного текста на слова с переносом по строке

Функция wordwrap() оборачивает текст на заданную ширину.

Пример

$longText = 'Это очень длинный текст, который нужно разбить на строки определённой длины.';
echo wordwrap($longText, 20, "\n");
Это очень длинный
текст, который нужно
разбить на строки
определённой длины.

Чтобы не разрывать слова, используется wordwrap() с четвёртым параметром true (отключает разрыв слов).

7. Сравнение строк с учётом локали

Функция strcmp() – бинарное сравнение. Для локализованного сравнения применяют strcoll().

Пример

$str1 = 'Äpfel';
$str2 = 'Apfel';
setlocale(LC_ALL, 'de_DE');
echo strcoll($str1, $str2); // зависит от локали

При сортировке массивов строк с национальными символами используют asort() с флагом SORT_LOCALE_STRING.

строковые функции в PHP - comments

En
Php string function (php)