🐘 PHP

Métodos de cadenas — guía completa en PHP: guía detallada

Что это такое и зачем? (аналогия из реальной жизни)

Представьте, что вы получили посылку. Внутри — длинная верёвка, на которой завязаны узелки с буквами. Это и есть строка — последовательность символов. В программировании строки повсюду: имя пользователя, текст сообщения, название товара, пароль, адрес сайта.

Но просто хранить текст мало. Что, если нужно:

  • Узнать, сколько букв в имени?
  • Найти, есть ли в тексте слово «кот»?
  • Заменить все «плохие» слова на «хорошие»?
  • Разбить длинное предложение на отдельные слова?
  • Убрать лишние пробелы в начале и конце?

Для всего этого существуют методы строк — специальные встроенные функции, которые умеют обращаться со строками как с живым материалом. Это как набор инструментов в руках мастера: ножницы (обрезать), клей (склеить), лупа (найти), кисточка (заменить цвет).

💡 Важно: В PHP строки — это не просто «текст в кавычках». Это сложные объекты, с которыми можно выполнять десятки разных операций. Методы строк — это команды, которые говорят: «Сделай с этой строкой то-то».

Теория: как это работает изнутри

Когда вы пишете $text = "Привет";, PHP создаёт в памяти специальную область, где хранится каждый символ по порядку: П, р, и, в, е, т. У каждого символа есть свой индекс — номер позиции, начиная с нуля.

Вот как это выглядит внутри:

$text = "Привет";
// Индексы:  0   1   2   3   4   5
// Символы:  П   р   и   в   е   т

echo $text[0]; // Выведет: П
echo $text[3]; // Выведет: в

Методы строк — это функции, которые принимают строку (или строки) и возвращают результат. Они не изменяют исходную строку (если только это не сказано особо), а создают новую. Это как ксерокс: вы делаете копию документа и работаете с ней, а оригинал остаётся нетронутым.

В PHP есть два типа функций для работы со строками:

  1. Обычные функции — вызываются как strlen($text)
  2. Методы через объект — вызываются как $text->length() (но в PHP это редкость, обычно используют первый вариант)
⚠️ Запомните: В PHP большинство строковых функций — это обычные функции, а не методы в стиле ООП. Но для простоты мы будем называть их «методами», так как они выполняют действия над строкой.

Синтаксис в PHP: все формы и варианты

В PHP строковые функции вызываются так:

$результат = имя_функции(строка, дополнительные_параметры);

Например:

$text = "  Привет, мир!  ";
$length = strlen($text);          // Длина строки
$trimmed = trim($text);           // Удаление пробелов по краям
$upper = strtoupper($text);       // Верхний регистр
$position = strpos($text, "мир"); // Поиск подстроки

Вот таблица самых популярных методов строк в PHP:

Метод Что делает Пример Результат
strlen() Возвращает длину строки strlen("Кот") 3
trim() Удаляет пробелы в начале и конце trim(" да ") "да"
strtoupper() Переводит в верхний регистр strtoupper("дом") "ДОМ"
strtolower() Переводит в нижний регистр strtolower("ДОМ") "дом"
ucfirst() Первая буква заглавная ucfirst("иван") "Иван"
strpos() Ищет подстроку, возвращает позицию strpos("Привет", "и") 2
substr() Вырезает часть строки substr("Привет", 0, 3) "При"
str_replace() Заменяет часть строки на другую str_replace("мир", "друг", "Привет, мир") "Привет, друг"
explode() Разбивает строку на массив по разделителю explode(",", "яблоко,груша,вишня") ["яблоко", "груша", "вишня"]
implode() Склеивает массив в строку implode(" - ", ["один", "два"]) "один - два"
str_repeat() Повторяет строку N раз str_repeat("ха", 3) "хахаха"
strrev() Переворачивает строку задом наперёд strrev("кот") "ток"
📌 Совет: Всегда проверяйте, не возвращает ли функция false или 0 — это частая причина ошибок у новичков.

Примеры кода — от простого к сложному

Пример 1: Приветствие пользователя

<?php
// Простейший пример: узнаём длину имени
$name = "Анна";
$length = strlen($name); // strlen считает количество символов

echo "Имя: $name
";          // Выведет: Имя: Анна
echo "Длина имени: $length
"; // Выведет: Длина имени: 4
?>

Объяснение: strlen() считает символы. Для кириллицы в UTF-8 работает корректно.

Пример 2: Чистка ввода от пробелов

<?php
// Пользователь случайно ввёл лишние пробелы
$userInput = "   Иван Петров   ";

// trim() убирает пробелы слева и справа
$clean = trim($userInput);

echo "Было: '$userInput'
";  // Было: '   Иван Петров   '
echo "Стало: '$clean'
";     // Стало: 'Иван Петров'
?>

Объяснение: trim() — незаменимая вещь при обработке форм. Пользователи часто копируют текст с пробелами.

Пример 3: Поиск слова в тексте

<?php
$text = "Сегодня отличная погода для прогулки";
$search = "погода";

// strpos() ищет подстроку и возвращает её позицию (начиная с 0)
$position = strpos($text, $search);

if ($position !== false) { // ВАЖНО: используем !==, а не !=
    echo "Слово '$search' найдено на позиции $position
";
} else {
    echo "Слово '$search' не найдено
";
}
// Выведет: Слово 'погода' найдено на позиции 19
?>

Объяснение: strpos() возвращает false, если ничего не найдено. Сравнивать нужно строго (!==), потому что позиция может быть 0 (первый символ), а 0 в PHP считается как false.

Пример 4: Замена слов в тексте

<?php
$text = "Я люблю кошек. Кошки — лучшие животные!";

// str_replace() заменяет все вхождения
$newText = str_replace("кошек", "собак", $text);

echo "Было: $text
";
echo "Стало: $newText
";
// Выведет: Я люблю собак. Кошки — лучшие животные!
// Заметили? "Кошки" не заменилось, потому что регистр разный
?>

Объяснение: str_replace() чувствителен к регистру. Чтобы заменить и «кошек», и «Кошек», нужно использовать str_ireplace() (регистронезависимая версия).

Пример 5: Разбивка предложения на слова

<?php
$sentence = "яблоко,груша,вишня,слива";

// explode() разбивает строку по разделителю (запятая)
$fruits = explode(",", $sentence);

// Теперь $fruits — это массив
echo "Первый фрукт: " . $fruits[0] . "
"; // яблоко
echo "Второй фрукт: " . $fruits[1] . "
"; // груша
echo "Всего фруктов: " . count($fruits) . "
"; // 4

// Обратная операция — implode() склеивает массив обратно
$back = implode(" и ", $fruits);
echo "Склеили: $back
"; // яблоко и груша и вишня и слива
?>

Объяснение: explode() и implode() — это два взаимно обратных метода. Они часто используются при работе с CSV-файлами, URL-параметрами и списками.

Пример 6: Извлечение части строки

<?php
$email = "user@example.com";

// substr() вырезает часть строки: откуда начать и сколько символов
$name = substr($email, 0, 4); // Берём 4 символа с начала
echo "Первые 4 символа: $name
"; // user

// Можно начать с отрицательного индекса — считаем с конца
$domain = substr($email, -9); // Берём последние 9 символов
echo "Домен: $domain
"; // example.com

// Ищем позицию символа @ и берём всё до него
$atPos = strpos($email, "@");
$username = substr($email, 0, $atPos);
echo "Имя пользователя: $username
"; // user
?>

Объяснение: substr() — мощный инструмент для извлечения подстрок. Отрицательные индексы позволяют считать с конца строки.

Пример 7: Проверка пароля (комплексный пример)

<?php
$password = "MyP@ss123";

// Проверяем длину пароля
if (strlen($password) < 8) {
    echo "Ошибка: пароль должен быть не менее 8 символов
";
}

// Проверяем, есть ли цифры
if (strpbrk($password, "0123456789") === false) {
    echo "Ошибка: пароль должен содержать хотя бы одну цифру
";
}

// Проверяем, есть ли спецсимволы
$specialChars = "!@#$%^&*()";
$hasSpecial = false;
for ($i = 0; $i < strlen($specialChars); $i++) {
    if (strpos($password, $specialChars[$i]) !== false) {
        $hasSpecial = true;
        break;
    }
}

if (!$hasSpecial) {
    echo "Ошибка: пароль должен содержать спецсимвол
";
}

// Переводим в нижний регистр для проверки
$lower = strtolower($password);
if ($lower === $password) {
    echo "Ошибка: пароль должен содержать заглавные буквы
";
}

echo "Проверка завершена!
";
?>

Объяснение: В этом примере мы используем сразу несколько методов: strlen() для длины, strpos() для поиска, strtolower() для приведения к нижнему регистру. Это реальный пример валидации пароля.

Сравнение с Python: чем похоже и чем отличается

Если вы уже знакомы с Python, вот ключевые отличия:

Операция PHP Python
Длина строки strlen($s) len(s)
Верхний регистр strtoupper($s) s.upper()
Нижний регистр strtolower($s) s.lower()
Поиск подстроки strpos($s, "подстрока") s.find("подстрока")
Замена str_replace("что", "на что", $s) s.replace("что", "на что")
Разбивка explode(",", $s) s.split(",")
Склейка implode(",", $arr) ",".join(arr)
Обрезка пробелов trim($s) s.strip()
Извлечение части substr($s, 0, 3) s[0:3]
Повторение str_repeat($s, 3) s * 3

Главные отличия:

  • Синтаксис: В Python методы вызываются через точку (s.upper()), в PHP — как функции (strtoupper($s)).
  • Порядок аргументов: В PHP строка часто передаётся первым аргументом, в Python — объект, у которого вызывается метод.
  • Регистр: PHP функции часто имеют префикс str_ или str, в Python — короткие имена.
  • Работа с UTF-8: В PHP нужно использовать mb_* функции (например, mb_strlen()) для корректной работы с многобайтовыми кодировками. В Python 3 строки по умолчанию Unicode.
💡 Совет: Если вы переходите с Python на PHP, запомните: в PHP почти всё делается через функции, а не через методы объектов. Но это не плохо и не хорошо — просто особенность языка.

Типичные ошибки и подводные камни

Ошибка 1: Путаница с регистром

<?php
$text = "Привет";
// strpos() ищет с учётом регистра!
$pos = strpos($text, "привет"); // вернёт false, потому что "п" маленькая
if ($pos === false) {
    echo "Не найдено! Используйте str_ireplace() для поиска без учёта регистра
";
}
?>

Ошибка 2: Сравнение с false через ==

<?php
$text = "abc";
$pos = strpos($text, "a"); // вернёт 0 (первый символ)

// НЕПРАВИЛЬНО:
if ($pos == false) { // 0 == false — это true в PHP!
    echo "Не найдено"; // Этот код выполнится, хотя "a" найдена!
}

// ПРАВИЛЬНО:
if ($pos === false) { // строгое сравнение
    echo "Не найдено";
} else {
    echo "Найдено на позиции $pos";
}
?>

Ошибка 3: Забыли про многобайтовые кодировки

<?php
$text = "Привет";
// strlen() считает байты, а не символы!
echo strlen($text); // Выведет 12, а не 6! (каждый символ кириллицы — 2 байта)

// Правильно использовать mb_strlen()
echo mb_strlen($text); // Выведет 6
?>

Ошибка 4: Изменение строки «на месте»

<?php
$text = "Привет";
strtoupper($text); // Это не изменит $text!
echo $text; // Выведет "Привет", а не "ПРИВЕТ"

// Нужно присвоить результат:
$text = strtoupper($text);
echo $text; // Теперь "ПРИВЕТ"
?>

Ошибка 5: Неправильный порядок аргументов в str_replace()

<?php
// str_replace(ЧТО_МЕНЯЕМ, НА_ЧТО_МЕНЯЕМ, ГДЕ_МЕНЯЕМ)
$text = "Я люблю PHP";
$result = str_replace("PHP", "Python", $text); // Правильно
echo $result; // "Я люблю Python"

// Частая ошибка — перепутать порядок:
$result = str_replace($text, "PHP", "Python"); // Неправильно!
?>
⚠️ Золотое правило: Всегда проверяйте документацию PHP (php.net) — там указан порядок аргументов для каждой функции.

Лучшие практики и советы профессионалов

1. Всегда используйте mb_* функции для работы с UTF-8

Если ваш сайт работает с русским, китайским или любым другим языком, где символы занимают больше 1 байта, используйте mb_strlen(), mb_strpos(), mb_substr() вместо обычных strlen(), strpos(), substr().

2. Проверяйте типы данных

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

<?php
$value = 12345; // Это число, а не строка
if (is_string($value)) {
    echo strlen($value);
} else {
    echo "Ошибка: ожидалась строка";
}
?>

3. Используйте строгое сравнение (===) с strpos()

Это уже обсуждалось, но повторим: strpos() может вернуть 0 (если подстрока в начале), и 0 == false в PHP — это true. Всегда используйте === или !==.

4. Не бойтесь комбинировать методы

Часто нужно выполнить несколько операций подряд. Это нормально:

<?php
$text = "  ПРИВЕТ, МИР!  ";
// Чистим, переводим в нижний регистр, делаем первую букву заглавной
$result = ucfirst(strtolower(trim($text)));
echo $result; // "Привет, мир!"
?>

5. Используйте heredoc и nowdoc для длинных строк

<?php
// Heredoc — как двойные кавычки, переменные подставляются
$name = "Иван";
$text = <<<TEXT
Привет, $name!
Это многострочный текст.
Он сохраняет переносы строк.
TEXT;

// Nowdoc — как одинарные кавычки, переменные не подставляются
$text2 = <<<'TEXT'
Привет, $name!
Здесь $name останется как есть.
TEXT;
?>

6. Для сложных замен используйте регулярные выражения

Когда str_replace() не справляется (нужно заменить по шаблону), используйте preg_replace():

<?php
$text = "Мой номер: 123-45-67";
// Заменяем все цифры на звёздочки
$hidden = preg_replace('/d/', '*', $text);
echo $hidden; // "Мой номер: ***-**-**"
?>

Вопросы для самопроверки

  1. Вопрос: Какая функция возвращает длину строки в PHP?

    Ответ: strlen() (или mb_strlen() для многобайтовых кодировок).

  2. Вопрос: Что вернёт strpos("Привет", "П")?

    Ответ: 0 (потому что символ «П» находится на первой позиции, индекс 0).

  3. Вопрос: Почему нельзя использовать == false при проверке результата strpos()?

    Ответ: Потому что 0 == false в PHP даёт true. Если подстрока найдена в начале строки, strpos() вернёт 0, и условие if ($pos == false) ошибочно сработает.

  4. Вопрос: Как удалить пробелы в начале и конце строки?

    Ответ: Функция trim().

  5. Вопрос: Чем отличается explode() от implode()?

    Ответ: explode() разбивает строку на массив по разделителю. implode() склеивает массив в строку через разделитель.

  6. Вопрос: Какая функция заменяет все вхождения подстроки в строке?

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

  7. Вопрос: Что вернёт substr("Программирование", 0, 6)?

    Ответ: "Програ" (первые 6 символов).

  8. Вопрос: Как перевести строку в верхний регистр?

    Ответ: strtoupper() (или mb_strtoupper() для UTF-8).

  9. Вопрос: В чём разница между str_replace() и preg_replace()?

    Ответ: str_replace() заменяет точное совпадение строки. preg_replace() использует регулярные выражения для замены по шаблону.

  10. Вопрос: Почему для работы с русским текстом нужно использовать mb_* функции?

    Ответ: Потому что русские буквы в кодировке UTF-8 занимают 2 байта. Обычные функции (strlen(), substr()) считают байты, а не символы, что приводит к ошибкам.

Итог и что изучить дальше

Мы прошли долгий путь от простого «что такое строка» до сложных примеров с валидацией паролей. Теперь вы знаете:

  • Что строки — это последовательности символов с индексами
  • Как использовать основные методы: strlen(), trim(), strpos(), substr(), str_replace(), explode(), implode()
  • Как избегать типичных ошибок (сравнение с false, многобайтовые кодировки)
  • Как PHP отличается от Python в работе со строками
  • Лучшие практики: используйте mb_* функции, проверяйте типы, комбинируйте методы

Что изучить дальше:

  1. Регулярные выражения (preg_match, preg_replace) — для сложного поиска и замены по шаблонам.
  2. Функции для работы с массивами — строки и массивы часто используются вместе.
  3. Форматирование строк — sprintf() и printf() для создания форматированного вывода.
  4. Работа с файлами — чтение и запись строк в файлы (file_get_contents(), file_put_contents()).
  5. URL-кодирование — urlencode() и urldecode() для работы с веб-адресами.
🎯 Главный совет: Не пытайтесь запомнить все функции. Запомните основные, а для остальных — знайте, что они существуют, и умейте быстро найти их в документации PHP (php.net). Практика — лучший способ запомнить!

Теперь вы готовы работать со строками в PHP как настоящий профессионал. Удачи в программировании!