Работа со строками в 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>Текст & символы</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.