preg_replace
(PHP 4, PHP 5) preg_replace — Выполняет поиск и замену по регулярному выражению
Описание
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); ?>
Результатом работы этого примера будет:
Если во время выполнения функции были обнаружены совпадения с шаблоном,
будет возвращено измененное значение 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"); ?>
Пример #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().
|
|