→ Пошук по сайту       Увійти / Зареєструватися
Знання Мова програмування PHP Работа со строками

Замена вхождения подстроки

Компетенція Програмування на PHP

Замена вхождения подстроки

Функция str_replace

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

str_replace(искомое значение, 
    значение для замены, объект)

Функция str_replace() ищет в рассматриваемом объекте значение и заменяет его значением, предназначенным для замены. Почему мы говорим здесь не про строки для поиска и замены и исходную строку, а про значения и объект, в котором происходит замена? Дело в том, что начиная с PHP 4.0.5 любой аргумент этой функции может быть массивом.

Если объект, в котором производится поиск и замена, является массивом, то эти действия выполняются для каждого элемента массива и в результате возвращается новый массив.

<?php
$greeting = array("Привет", "Привет всем!",
   "Привет, дорогая!"); // объект
$new_greet = str_replace("Привет", 
   "Доброе утро", $greeting); 
   // делаем замену
print_r($new_greet);
/* получим: Array ([0]=>Доброе утро 
   [1]=>Доброе утро всем!
   [2]=>Доброе утро, дорогая!) */
?>
        
Пример 8.7. Использование функции str_replace()

Если искомое значение и значение для замены – массивы, то берется по одному значению из каждого массива и производится их поиск и замена в объекте. Если значений для замены меньше, чем значений для поиска, то в качестве новых значений используется пустая строка.

<?php
$greeting = array("Привет", "Привет всем!",
   "Привет, дорогая!","Здравствуйте", 
   "Здравствуйте, товарищи", "Hi"); 
   // объект
$search = array ("Привет",
   "Здравствуйте", "Hi"); 
   // значения, которые будем заменять
$replace = array ("Доброе утро",
   "День добрый"); 
   // значения, которыми будем заменять
$new_greet = str_replace($search, $replace,
                         $greeting);
   // делаем замену
print_r($new_greet); 
   //выводим полученный массив
?>
        
Пример 8.8. Использование функции str_replace(). Вариант 2

В результате получим такой массив:

Array (
[0] => Доброе утро
[1] => Доброе утро всем!
[2] => Доброе утро, дорогая!
[3] => День добрый
[4] => День добрый, товарищи
[5] =>
)
        

Если значения для поиска – массив, а значение для заменыстрока, то эта строка будет использована для замены всех найденных значений.

<?php
$greeting = array("Привет", "Привет всем!",
   "Привет, дорогая!", "Здравствуйте",
   "Здравствуйте, товарищи"); 
   // объект
$search = array ("Привет","Здравствуйте"); 
   // значения, которые будем заменять
$replace = "День добрый"; 
   // значение, которым будем заменять
$new_greet = str_replace($search, 
   $replace, $greeting);  // делаем замену
print_r($new_greet); 
   //выводим полученный массив
?>
        
Пример 8.9. Использование функции str_replace(). Вариант 3

Получим:

Array (
[0] => День добрый
[1] => День добрый всем!
[2] => День добрый, дорогая!
[3] => День добрый
[4] => День добрый, товарищи
)
        

Функция str_replace() чувствительна к регистру, но существует ее регистронезависимый аналог – функция str_ireplace(). Однако эта функция поддерживается не во всех версиях PHP.

Еще один пример использования функции str_replace() – обработка шаблонов.

Обратимся в очередной раз к описанию какого-либо документа, например статьи. Много раз мы уже создавали форму для ввода подобного описания и даже отображали данные, введенные пользователем в такого рода форму. Но как отображать эти данные, мы описывали непосредственно в коде нашей программы. Теперь мы хотим, чтобы способ отображения данных задавал сам пользователь. Для этого добавим в нашу форму еще один элемент для ввода шаблона.

<h2>Введите описание статьи</h2>
<form action=sbl.php>
<table border=0>
<tr><td>Название </td><td><input 
  type=text name=title > </td></tr>
<tr><td>Краткое содержание </td><td><input 
  type=text name=description > </td></tr>
<tr><td>Автор </td><td><input 
  type=text name=author > </td></tr>
<tr><td>Дата публикации </td><td><input 
  type=text name=published ></td></tr>
<tr><td>Шаблон документа </td><td><textarea
  name=shablon ></textarea></td></tr>
</table>
<input type=submit value="Отправить">
</form>
        

Однако просто поля для ввода шаблона недостаточно. Один человек введет в него одно, другой – другое. Нужно договориться о том, как создавать шаблоны, что можно в них использовать, т.е. нужно придумать язык шаблонов. Например, мы договариваемся, что при создании шаблона можно задействовать любые html-теги, а набор спецсимволов вида <!имя_элемента> определяет значение элемента с именем имя_элемента. Далее, как обрабатывать такого рода шаблоны? Можно использовать функцию str_replace():

<?php
$tmpl = $_GET["shablon"]; 
/* шаблон, введенный пользователем. 
Например, это может быть такая строка:
"<h1><!title></h1> <p><font 
size=-1><!description></font></p><p 
align=right><!author><br><!published></p>" */
function Show(){ 
  // функция, которая производит замену
  // элемента шаблона на его значение
global $tmpl;
foreach($_GET as $k => $v) {
   $tmpl = str_replace("<!$k>",$v,$tmpl);
}
echo $tmpl;
}
Show();
?>
        

Как эти файлы выглядят для обычного пользователя? Если мы введем в форму такие данные как показано на рисунке 8.1, то в результате получим:

Первая машина для переписи населения
Идея наносить данные на перфокарты и затем
считывать и обрабатывать их автоматически 
принадлежала Джону Биллингсу, а ее 
техническое решение осуществил Герман
Холлерит. Перфокарта Холлерита оказалась 
настолько удачной, что без малейших изменений
просуществовала до наших дней.
                                А. М. Федотов
                                     12.02.03
        

Форма для ввода описания документа «статья»    и шаблона для его отображения
Рис. 8.1.  Форма для ввода описания документа «статья» и шаблона для его отображения

Функция substr_replace

Эта функция сочетает в себе свойства двух уже рассмотренных нами функций – функции str_replace() и substr(). Ее синтаксис таков:

substr_replace (исходная строка, 
    строка для замены, 
    позиция начального символа [, длина])

Эта функция заменяет часть строки строкой, предназначенной для замены. Заменяется та часть строки (т.е. подстрока), которая начинается с позиции, указанной параметром позиция начального символа. С помощью дополнительного аргумента длина можно ограничить число заменяемых символов. То есть, фактически, мы не указываем конкретно строку, которую нужно заменить, мы только описываем, где она находится и, возможно, какую длину имеет. В этом отличие функции substr_replace() от str_replace().

Как и в случае с функцией substr() аргументы позиция начального символа и длина могут быть отрицательными. Если позиция начального символа отрицательна, то замена производится, начиная с этой позиции относительно конца строки. Отрицательная длина задает, сколько символов от конца строки не должно быть заменено. Если длина не указывается, то замена происходит до конца строки.

<?php
$text = "Меня зовут Вася.";
echo "Исходная строка: $text<hr>\n";
/* Следующие две строки заменят всю 
исходную строку строкой 'А меня – Петя' */
echo substr_replace($text, 'А меня – Петя',
     0) . "<br>\n";
echo substr_replace($text, 'А меня – Петя',
     0, strlen($text)) . "<br>\n";
// Следующая строка добавит слово 'Привет! '
// в начало исходной строки
echo substr_replace($text, 'Привет! ',
     0, 0) . "<br>\n";
// Следующие две строки заменят имя Вася
// на имя Иван в исходной строке
echo substr_replace($text, 'Иван', 11,
    -1) . "<br>\n";
echo substr_replace($text, 'Иван', -5,
    -1) . "<br>\n";
?>
        
Пример 8.10. Использование функции str_replace()

В результате работы этого скрипта получим:

Исходная строка: Меня зовут Вася.
------------------------------------------
А меня – Петя
А меня – Петя
Привет! Меня зовут Вася.
Меня зовут Иван.
Меня зовут Иван.
        
    © INTUIT.ru. Автор: Н.В. Савельева. Курс размещен по договоренности с администрацией INTUIT.ru
загрузка...
Теми розділу
Сторінки, близькі за змістом