Операции со строками в PHP
Операции со строками в PHP — набор приёмов и функций для объединения, поиска, изменения, разбиения, сравнения и безопасного вывода текстовых данных. Строки используются почти в любом PHP-проекте: при обработке форм, генерации HTML, работе с URL, логами, файлами, базами данных и API.
В PHP строка относится к базовым типам данных. Она может быть записана в одинарных или двойных кавычках, а также через синтаксис heredoc и nowdoc.[1]
Конкатенация строк
Для объединения строк используется оператор .. Это одна из самых частых операций при формировании сообщений, HTML-фрагментов, путей к файлам и строк запросов.[2]
$firstName = 'Ivan';
$lastName = 'Petrov';
$fullName = $firstName . ' ' . $lastName;
echo $fullName; // Ivan Petrov
Оператор .= добавляет новую часть к уже существующей строке.
$message = 'Hello';
$message .= ', ';
$message .= 'World!';
echo $message; // Hello, World!
Интерполяция переменных
В строках с двойными кавычками PHP подставляет значения переменных. В строках с одинарными кавычками переменные не интерпретируются.
$name = 'Anna';
echo "Привет, $name!"; // Привет, Anna!
echo 'Привет, $name!'; // Привет, $name!
Для сложных выражений удобно использовать фигурные скобки.
$user = [
'name' => 'Anna'
];
echo "Пользователь: {$user['name']}";
Длина строки
Функция strlen() возвращает длину строки в байтах.[3] Для строк на латинице это часто совпадает с количеством символов, но для UTF-8 строк с кириллицей результат будет другим.
echo strlen('Hello'); // 5
echo strlen('Привет'); // 12 в UTF-8, потому что кириллические символы занимают больше одного байта
Для подсчёта символов в многобайтовой строке используется mb_strlen() из расширения mbstring.[4]
echo mb_strlen('Привет', 'UTF-8'); // 6
Поиск подстроки
Для проверки позиции подстроки используется strpos(). Функция возвращает позицию первого вхождения или false, если подстрока не найдена.
$text = 'PHP is used for web development';
$position = strpos($text, 'web');
if ($position !== false) {
echo 'Подстрока найдена';
}
Важно использовать строгое сравнение !== false. Если подстрока находится в начале строки, strpos() вернёт 0, а обычная проверка через if ($position) ошибочно воспримет это как отсутствие результата.
$text = 'PHP language';
if (strpos($text, 'PHP') !== false) {
echo 'Найдено в начале строки';
}
Проверка начала и конца строки
В современных версиях PHP для проверки начала и конца строки используются функции str_starts_with() и str_ends_with().
$url = 'https://wikijournal.org';
if (str_starts_with($url, 'https://')) {
echo 'Безопасный протокол';
}
if (str_ends_with($url, '.org')) {
echo 'Домен .org';
}
Такие функции делают код понятнее, чем ручное сравнение через substr().
Получение части строки
Функция substr() возвращает часть строки, начиная с указанной позиции. Третий параметр задаёт длину возвращаемого фрагмента.
$text = 'Hello, World!';
echo substr($text, 0, 5); // Hello
echo substr($text, 7, 5); // World
Отрицательная позиция позволяет отсчитывать символы с конца строки.
$filename = 'archive.tar.gz';
echo substr($filename, -3); // .gz
Для многобайтовых строк лучше использовать mb_substr().
$text = 'Привет, мир!';
echo mb_substr($text, 0, 6, 'UTF-8'); // Привет
Замена подстроки
Функция str_replace() заменяет все найденные вхождения одной строки на другую.[5]
$text = 'Hello, World!';
$result = str_replace('World', 'PHP', $text);
echo $result; // Hello, PHP!
Можно заменять сразу несколько значений.
$text = 'red green blue';
$result = str_replace(
['red', 'green', 'blue'],
['красный', 'зелёный', 'синий'],
$text
);
echo $result;
Изменение регистра
Для изменения регистра используются strtolower() и strtoupper(). Они работают с байтовыми строками и подходят для простых латинских строк.
echo strtolower('HELLO'); // hello
echo strtoupper('hello'); // HELLO
Для строк в UTF-8 лучше использовать функции mb_strtolower() и mb_strtoupper().
echo mb_strtoupper('привет', 'UTF-8'); // ПРИВЕТ
Удаление пробелов
Функция trim() удаляет пробелы и служебные символы в начале и конце строки. Это полезно при обработке данных из форм.
$email = ' user@example.com ';
$email = trim($email);
echo $email; // user@example.com
Функции ltrim() и rtrim() удаляют символы только слева или только справа.
echo ltrim(' text'); // text
echo rtrim('text '); // text
Разделение строки на массив
Функция explode() разбивает строку на массив по заданному разделителю.[6]
$tags = 'php,web,backend';
$items = explode(',', $tags);
print_r($items);
Результат:
Array
(
[0] => php
[1] => web
[2] => backend
)
Объединение массива в строку
Функция implode() объединяет элементы массива в строку с указанным разделителем.[7]
$items = ['php', 'web', 'backend'];
$tags = implode(', ', $items);
echo $tags; // php, web, backend
Форматирование строк
Функция sprintf() возвращает отформатированную строку. Она полезна, когда нужно аккуратно подставить значения в заранее заданный шаблон.
$name = 'Ivan';
$age = 30;
$message = sprintf('Пользователь %s, возраст: %d', $name, $age);
echo $message;
Для вывода форматированной строки сразу на экран используется printf().
printf('Цена: %.2f', 1499.9); // Цена: 1499.90
Безопасный вывод строк в HTML
При выводе пользовательских данных в HTML нужно экранировать специальные символы. Для этого используется htmlspecialchars().[8]
$name = '<script>alert("xss")</script>';
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
Без экранирования пользовательская строка может быть интерпретирована браузером как HTML или JavaScript-код. Это создаёт риск XSS-уязвимостей.
Работа с Unicode и UTF-8
Многие базовые строковые функции PHP работают с байтами. Это важно учитывать при работе с русским текстом и другими языками, где символы в UTF-8 занимают больше одного байта.
$text = 'Код';
echo strlen($text); // 6
echo mb_strlen($text, 'UTF-8'); // 3
Для русскоязычных строк лучше использовать функции семейства mb_*: mb_strlen(), mb_substr(), mb_strtolower(), mb_strtoupper(). Расширение mbstring предназначено для работы с многобайтовыми строками.[9]
Частые ошибки
Проверка strpos() без строгого сравнения
$text = 'PHP language';
if (strpos($text, 'PHP')) {
echo 'Найдено';
}
Такой код не выведет сообщение, потому что позиция 0 преобразуется к false. Правильный вариант:
if (strpos($text, 'PHP') !== false) {
echo 'Найдено';
}
Использование strlen() для русских строк
echo strlen('Привет'); // 12, а не 6
Для подсчёта символов нужно использовать mb_strlen().
Вывод данных без экранирования
echo $_GET['name'];
Безопаснее выводить данные так:
echo htmlspecialchars($_GET['name'] ?? '', ENT_QUOTES, 'UTF-8');
Практический пример
В этом примере строка из формы очищается от лишних пробелов, проверяется, сокращается и безопасно выводится на страницу.
$name = $_POST['name'] ?? '';
$name = trim($name);
if (mb_strlen($name, 'UTF-8') > 30) {
$name = mb_substr($name, 0, 30, 'UTF-8');
}
echo 'Здравствуйте, ' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '!';
Такой подход не заменяет полноценную валидацию данных, но показывает базовую цепочку обработки строки: получить, очистить, ограничить длину и безопасно вывести.
Заключение
Операции со строками в PHP лежат в основе веб-разработки. Разработчик постоянно объединяет строки, ищет подстроки, заменяет фрагменты, разбивает данные на массивы, форматирует вывод и экранирует пользовательский ввод. Для простых латинских строк часто достаточно базовых функций, но при работе с UTF-8 и русским текстом важно использовать функции mb_*.
