Как реализовать замену текста в строковых переменных PHP
Основные методы замены подстрок
В PHP существует несколько функций для замены частей строк. Наиболее универсальная и производительная - str_replace. Рассмотрим её и альтернативы.
Как эффективно заменить все вхождения подстроки в строке?
Функция str_replace выполняет замену всех вхождений искомой строки на строку замены. Она работает быстрее аналогов при простых заменах.
<?php
$text = 'Я люблю PHP и MySQL';
$newText = str_replace('PHP', 'JavaScript', $text);
echo $newText; // Я люблю JavaScript и MySQL
?>Php замена подстроки (замена подстроки в php)
Я люблю JavaScript и MySQL
Первый аргумент - что ищем, второй - на что заменяем, третий - исходная строка. Можно передавать массивы для множественных замен.
Типичная ошибка: если искомый и заменяемый элементы массива имеют совпадающие значения, может возникнуть цепная замена. Лучше избегать таких ситуаций или использовать strtr.
Как заменить подстроку без учёта регистра?
Функция str_ireplace - регистронезависимый аналог str_replace. Полезна при поиске, где регистр не важен.
<?php
$text = 'Php - популярный язык';
$result = str_ireplace('php', 'Python', $text);
echo $result; // Python - популярный язык
?>
Python - популярный язык
Сигнатура аналогична str_replace, но поиск игнорирует регистр.
Проблема: при использовании массивов str_ireplace может давать неожиданный порядок замен, если один элемент является подстрокой другого. Рекомендуется сначала заменять более длинные строки.
Как заменить текст в заданной позиции строки?
Функция substr_replace заменяет часть строки, начиная с указанного смещения. Она не ищет подстроку, а оперирует позициями.
<?php
$str = 'Привет, мир!';
$result = substr_replace($str, 'вселенная', 9, 3);
echo $result; // Привет, вселенная!
?>
Привет, вселенная!
Третий параметр - начальная позиция, четвёртый - длина заменяемой части. Если длина не указана, замена происходит до конца строки.
Распространённая ошибка: отрицательное смещение ведёт к замене с конца строки, что может запутать. Обязательно тестировать на крайних значениях.
Как заменить подстроку по шаблону (регулярному выражению)?
Функция preg_replace позволяет выполнять замену на основе регулярного выражения, что даёт гибкость при поиске сложных конструкций.
<?php
$text = 'Цены: 50$, 100$, 200$';
$result = preg_replace('/\\d+\$/', 'USD', $text);
echo $result; // Цены: USD, USD, USD
?>
Цены: USD, USD, USD
Шаблон /\\d+\$/ ищет одну или более цифр, за которыми следует знак доллара. Замена происходит на 'USD'.
Типичная проблема: неверно экранированные символы (например, обратные слеши) в шаблоне вызывают ошибки. Используйте разделители (например, /) и проверяйте шаблон через preg_last_error().
Расширенные примеры замены подстрок
Ниже приведены более сложные сценарии использования функций замены, включая комбинирование и нестандартные приёмы.
Пример 1: Замена с подсчётом количества замен
<?php
$text = 'раз раз раз';
$count = 0;
$new = str_replace('раз', 'два', $text, $count);
echo 'Результат: ' . $new . ', замен: ' . $count;
?>
Результат: два два два, замен: 3
Пример 2: Использование обратных ссылок в preg_replace
<?php
$date = '2025-03-15';
$newDate = preg_replace('/(\\d{4})-(\\d{2})-(\\d{2})/', '$3.$2.$1', $date);
echo $newDate;
?>
15.03.2025
Пример 3: preg_replace_callback с пользовательской функцией
<?php
$text = 'У нас есть 5 яблок и 3 груши';
$result = preg_replace_callback('/\\d+/', function($matches) {
return $matches[0] * 2;
}, $text);
echo $result;
?>
У нас есть 10 яблок и 6 груши
Пример 4: Замена для многобайтовых строк с mb_ereg_replace
<?php
$textMb = 'Привет, мир!';
$newMb = mb_ereg_replace('мир', 'вселенная', $textMb);
echo $newMb;
?>
Привет, вселенная!
Пример 5: Комбинирование preg_replace и str_replace
<?php
$text = 'Цена: 10$ и 20$ (включая налог)';
$step1 = preg_replace('/\\d+\$/', 'N', $text);
$step2 = str_replace('(', ' (', $step1);
echo $step2;
?>
Цена: N и N (включая налог)
Пример 6: Безопасная множественная замена с strtr
<?php
$subst = array('cat' => 'dog', 'dog' => 'cat');
$text = 'cat and dog';
$result = strtr($text, $subst);
echo $result;
?>
dog and cat
Пример 7: substr_replace на основе strpos
<?php
$text = 'Hello World';
$pos = strpos($text, 'World');
if ($pos !== false) {
$new = substr_replace($text, 'PHP', $pos, strlen('World'));
echo $new;
}
?>
Hello PHP
Пример 8: Удаление скобок и содержимого с помощью lookaround
<?php
$text = 'email@domain.com (пользователь)';
$clean = preg_replace('/\\s*\\([^)]*\\)\\s*/', '', $text);
echo $clean;
?>
email@domain.com
Пример 9: Замена с игнорированием регистра через preg_replace (флаг i)
<?php
$text = 'Php is great, but php has competitors';
$result = preg_replace('/\\bphp\\b/i', 'PHP', $text);
echo $result;
?>
PHP is great, but PHP has competitors
Пример 10: Множественная замена с массивами
<?php
$search = array('apples', 'oranges');
$replace = array('bananas', 'grapes');
$text = 'I like apples and oranges';
$result = str_replace($search, $replace, $text);
echo $result;
?>
I like bananas and grapes
При использовании массивов с str_replace необходимо помнить о возможной цепной замене. Для безопасной одновременной замены рекомендуется strtr.