Перейти к содержанию

Операции со строками в PHP

Материал из Викижурнал
Операции со строками в 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_*.

Другие статьи о PHP

Источники