preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5)
preg_replace_callback -- Выполняет поиск по регулярному выражению и замену с использованием функции обратного вызова
Описание
mixed
preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
Поведение этой функции во многом напоминает
preg_replace(), за исключением того, что вместо
параметра replacement необходимо указывать
callback функцию, которой в качестве
входящего параметра передается массив найденных вхождений.
Ожидаемый результат - строка, которой будет произведена замена.
Пример 1. preg_replace_callback() пример
<?php // Этот текст был использован в 2002 году // мы хотим обновить даты к 2003 году $text = "April fools day is 04/01/2002\n"; $text.= "Last christmas was 12/24/2001\n";
// функция обратного вызова function next_year($matches) { // как обычно: $matches[0] - полное вхождение шаблона // $matches[1] - вхождение первой подмаски, // заключенной в круглые скобки, и так далее... return $matches[1].($matches[2]+1); }
echo preg_replace_callback( "|(\d{2}/\d{2}/)(\d{4})|", "next_year", $text);
// результат: // April fools day is 04/01/2003 // Last christmas was 12/24/2002 ?>
|
|
Достаточно часто callback функция, кроме как в вызове
preg_replace_callback(), ни в чем больше не участвует.
Исходя из этих соображений, можно использовать create_function()
для создания безымянной функции обратного вызова непосредственно
в вызове preg_replace_callback().
Если вы используете такой подход, вся информация, связанная с заменой по
регулярному выражению, будет собрана в одном месте, и пространство имен
функций не будет загромождаться неиспользуемыми записями.
Пример 2. preg_replace_callback() и create_function()
<?php /* фильтр, подобный тому, что используется в системах Unix * для преобразования в заглавные начальных букв параграфа */
$fp = fopen("php://stdin", "r") or die("can't read stdin"); while (!feof($fp)) { $line = fgets($fp); $line = preg_replace_callback( '|<p>\s*\w|', create_function( // Использование одиночных кавычек в данном случае принципиально, // альтернатива - экранировать все символы '$' '$matches', 'return strtolower($matches[0]);' ), $line ); echo $line; } fclose($fp); ?>
|
|
Смотрите также preg_replace() и
create_function().