PHP字符串方法——完整指南
Что это такое и зачем? (аналогия из реальной жизни)
Представьте, что вы получили посылку. Внутри — длинная верёвка, на которой завязаны узелки с буквами. Это и есть строка — последовательность символов. В программировании строки повсюду: имя пользователя, текст сообщения, название товара, пароль, адрес сайта.
Но просто хранить текст мало. Что, если нужно:
- Узнать, сколько букв в имени?
- Найти, есть ли в тексте слово «кот»?
- Заменить все «плохие» слова на «хорошие»?
- Разбить длинное предложение на отдельные слова?
- Убрать лишние пробелы в начале и конце?
Для всего этого существуют методы строк — специальные встроенные функции, которые умеют обращаться со строками как с живым материалом. Это как набор инструментов в руках мастера: ножницы (обрезать), клей (склеить), лупа (найти), кисточка (заменить цвет).
💡 Важно: В PHP строки — это не просто «текст в кавычках». Это сложные объекты, с которыми можно выполнять десятки разных операций. Методы строк — это команды, которые говорят: «Сделай с этой строкой то-то».
Теория: как это работает изнутри
Когда вы пишете $text = "Привет";, PHP создаёт в памяти специальную область, где хранится каждый символ по порядку: П, р, и, в, е, т. У каждого символа есть свой индекс — номер позиции, начиная с нуля.
Вот как это выглядит внутри:
$text = "Привет";
// Индексы: 0 1 2 3 4 5
// Символы: П р и в е т
echo $text[0]; // Выведет: П
echo $text[3]; // Выведет: в
Методы строк — это функции, которые принимают строку (или строки) и возвращают результат. Они не изменяют исходную строку (если только это не сказано особо), а создают новую. Это как ксерокс: вы делаете копию документа и работаете с ней, а оригинал остаётся нетронутым.
В PHP есть два типа функций для работы со строками:
- Обычные функции — вызываются как
strlen($text) - Методы через объект — вызываются как
$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; // "Мой номер: ***-**-**"
?>
Вопросы для самопроверки
-
Вопрос: Какая функция возвращает длину строки в PHP?
Ответ:
strlen()(илиmb_strlen()для многобайтовых кодировок). -
Вопрос: Что вернёт
strpos("Привет", "П")?Ответ: 0 (потому что символ «П» находится на первой позиции, индекс 0).
-
Вопрос: Почему нельзя использовать
== falseпри проверке результатаstrpos()?Ответ: Потому что
0 == falseв PHP даётtrue. Если подстрока найдена в начале строки,strpos()вернёт 0, и условиеif ($pos == false)ошибочно сработает. -
Вопрос: Как удалить пробелы в начале и конце строки?
Ответ: Функция
trim(). -
Вопрос: Чем отличается
explode()отimplode()?Ответ:
explode()разбивает строку на массив по разделителю.implode()склеивает массив в строку через разделитель. -
Вопрос: Какая функция заменяет все вхождения подстроки в строке?
Ответ:
str_replace()(регистрозависимая) илиstr_ireplace()(регистронезависимая). -
Вопрос: Что вернёт
substr("Программирование", 0, 6)?Ответ: "Програ" (первые 6 символов).
-
Вопрос: Как перевести строку в верхний регистр?
Ответ:
strtoupper()(илиmb_strtoupper()для UTF-8). -
Вопрос: В чём разница между
str_replace()иpreg_replace()?Ответ:
str_replace()заменяет точное совпадение строки.preg_replace()использует регулярные выражения для замены по шаблону. -
Вопрос: Почему для работы с русским текстом нужно использовать
mb_*функции?Ответ: Потому что русские буквы в кодировке UTF-8 занимают 2 байта. Обычные функции (
strlen(),substr()) считают байты, а не символы, что приводит к ошибкам.
Итог и что изучить дальше
Мы прошли долгий путь от простого «что такое строка» до сложных примеров с валидацией паролей. Теперь вы знаете:
- Что строки — это последовательности символов с индексами
- Как использовать основные методы:
strlen(),trim(),strpos(),substr(),str_replace(),explode(),implode() - Как избегать типичных ошибок (сравнение с false, многобайтовые кодировки)
- Как PHP отличается от Python в работе со строками
- Лучшие практики: используйте
mb_*функции, проверяйте типы, комбинируйте методы
Что изучить дальше:
- Регулярные выражения (preg_match, preg_replace) — для сложного поиска и замены по шаблонам.
- Функции для работы с массивами — строки и массивы часто используются вместе.
- Форматирование строк —
sprintf()иprintf()для создания форматированного вывода. - Работа с файлами — чтение и запись строк в файлы (
file_get_contents(),file_put_contents()). - URL-кодирование —
urlencode()иurldecode()для работы с веб-адресами.
🎯 Главный совет: Не пытайтесь запомнить все функции. Запомните основные, а для остальных — знайте, что они существуют, и умейте быстро найти их в документации PHP (php.net). Практика — лучший способ запомнить!
Теперь вы готовы работать со строками в PHP как настоящий профессионал. Удачи в программировании!