Руководство по PHP
Пред. |  | След.

# preg_replace

(PHP 3 >= 3.0.9, PHP 4, PHP 5)

preg_replace -- Выполняет поиск и замену по регулярному выражению

## Описание

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )

Выполняет поиск в строке `subject` совпадений с шаблоном `pattern` и заменяет их на `replacement`. В случае, если параметр `limit` указан, будет произведена замена `limit` вхождений шаблона; в случае, если `limit` опущен либо равняется -1, будут заменены все вхождения шаблона.

`Replacement` может содержать ссылки вида `\\`n`` либо (начиная с PHP 4.0.4) ``$n``, причем последний вариант предпочтительней. Каждая такая ссылка, будет заменена на подстроку, соответствующую `n`'нной заключенной в круглые скобки подмаске. `n` может принимать значения от 0 до 99, причем ссылка `\\0` (либо `$0`) соответствует вхождению всего шаблона. Подмаски нумеруются слева направо, начиная с единицы.

При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида `\\n` приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как `\\11`, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией `\${1}1`, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру `1`.

Пример 1. Использование подмасок, за которыми следует цифра

`<?php $string = "April 15, 2003"; $pattern = "/(\w+) (\d+), (\d+)/i"; $replacement = "\${1}1,\$3"; echo preg_replace($pattern, $replacement, $string); ?>`

Результатом работы этого примера будет:

    April1,2003

Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение `subject`, в противном случае будет возвращен исходный текст `subject`.

Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для `pattern` и `replacement` не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.

Пример 2. Использование массивов с числовыми индексами в качестве аргументов функции preg_replace()

`<?php $string = "The quick brown fox jumped over the lazy dog."; $patterns[0] = "/quick/"; $patterns[1] = "/brown/"; $patterns[2] = "/fox/"; $replacements[2] = "bear"; $replacements[1] = "black"; $replacements[0] = "slow"; echo preg_replace($patterns, $replacements, $string); ?>`

Результат:

    The bear black slow jumped over the lazy dog.

Используя ksort(), получаем желаемый результат:

`<?php ksort($patterns); ksort($replacements); echo preg_replace($patterns, $replacements, $string); ?>`

Результат:

    The slow black bear jumped over the lazy dog.

В случае, если параметр `subject` является массивом, поиск и замена по шаблону производятся для каждого из его элементов. Возвращаемый результат также будет массивом.

В случае, если параметры `pattern` и `replacement` являются массивами, preg_replace() поочередно извлекает из обоих массивов по паре элементов и использует их для операции поиска и замены. Если массив `replacement` содержит больше элементов, чем `pattern`, вместо недостающих элементов для замены будут взяты пустые строки. В случае, если `pattern` является массивом, а `replacement` - строкой, по каждому элементу массива `pattern` будет осущесвтлен поиск и замена на `pattern` (шаблоном будут поочередно все элементы массива, в то время как строка замены остается фиксированной). Вариант, когда `pattern` является строкой, а `replacement` - массивом, не имеет смысла.

Модификатор `/e` меняет поведение функции preg_replace() таким образом, что параметр `replacement` после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр `replacement` должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.

Пример 3. Замена по нескольким шаблонам

`<?php $patterns = array ("/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/"); $replace = array ("\\3/\\4/\\1\\2", "$\\1 ="); echo preg_replace($patterns, $replace, "{startDate} = 1999-5-27"); ?>`

Этот пример выведет:

    $startDate = 5/27/1999

Пример 4. Использование модификатора /e

`<?php preg_replace("/(<\/?)(\w+)([^>]*>)/e", "'\\1'.strtoupper('\\2').'\\3'", $html_body); ?>`

Преобразует все HTML-теги к верхнему регистру

Пример 5. Конвертор HTML в текст

`<?php
// $document на выходе должен содержать HTML-документ.
// Необходимо удалить все HTML-теги, секции javascript,
// пробельные символы. Также необходимо заменить некоторые
// HTML-сущности на их эквивалент.
$search = array ("'<script[^>]*?>.*?</script>'si", // Вырезает javaScript
"'<[\/\!]*?[^<>]*?>'si", // Вырезает HTML-теги
"'([\r\n])[\s]+'", // Вырезает пробельные символы
"'&(quot|#34);'i", // Заменяет HTML-сущности
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"'&(pound|#163);'i",
"'&(copy|#169);'i",
"'&#(\d+);'e"); // интерпретировать как php-код
$replace = array ("",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");
$text = preg_replace($search, $replace, $document);
?>`

> Замечание: Параметр `limit` доступен в PHP 4.0.1pl2 и выше.

Смотрите также preg_match(), preg_match_all(), и preg_split().

Пред. | Начало | След.
preg_replace_callback | Уровень выше | preg_split