preg_replace_callback
(PHP 4 >= 4.0.5, PHP 5, PHP 7)
preg_replace_callback — Выполняет поиск по регулярному выражению и замену с использованием callback-функции
Описание
$pattern
, callable $callback
, string|array $subject
, int $limit
= -1
, int &$count
= null
, int $flags
= 0
) : string|array|null
Поведение этой функции во многом напоминает
preg_replace(), за исключением того, что вместо
параметра replacement
необходимо указывать
callback
-функцию.
Список параметров
-
pattern
-
Искомый шаблон. Может быть как строкой, так и массивом строк.
-
callback
-
Вызываемая callback-функция, которой будет передан массив совпавших элементов из строки
subject
. Callback-функция должна вернуть строку с заменой. Callback-функция должна быть описана так:handler ( array$matches
) : stringДостаточно часто
callback
функция, кроме как в вызове preg_replace_callback(), ни в чем больше не участвует. Исходя из этих соображений, можно использовать анонимные функции для создания callback-функции непосредственно в вызове preg_replace_callback(). Если вы используете такой подход, вся информация, связанная с заменой по регулярному выражению, будет собрана в одном месте, и пространство имен функций не будет загромождаться неиспользуемыми записями.Пример #1 preg_replace_callback() и анонимная функция
<?php
/* фильтр, подобный тому, что используется в системах Unix
* для преобразования заглавных букв в начале параграфа в строчные */
$fp = fopen("php://stdin", "r") or die("не удалось прочесть stdin");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>\s*\w|',
function ($matches) {
return strtolower($matches[0]);
},
$line
);
echo $line;
}
fclose($fp);
?> -
subject
-
Строка или массив строк для поиска и замены.
-
limit
-
Максимально возможное количество замен для каждого шаблона в каждой строке
subject
. По умолчанию равно-1
(без ограничений). -
count
-
Если указана, то эта переменная будет заполнена количеством произведенных замен.
-
flags
-
flags
может быть комбинацией флаговPREG_OFFSET_CAPTURE
иPREG_UNMATCHED_AS_NULL
, которые влияют на формат массива совпадений. Смотрите описание в preg_match() для более подробной информации.
Возвращаемые значения
preg_replace_callback() возвращает массив,
если параметр subject
является массивом,
иначе возвращается строка. В случае ошибок возвращается null
Если найдены совпадения, будет возвращена результирующая строка,
иначе subject
вернется неизмененным.
Список изменений
Версия | Описание |
---|---|
7.4.0 |
Добавлен параметр flags .
|
Примеры
Пример #2 Пример использования preg_replace_callback()
<?php
// Этот текст был использован в 2002 году
// мы хотим обновить даты к 2003 году
$text = "День смеха был 01/04/2002\n";
$text.= "Последнее Рождество было 24/12/2001\n";
// callback-функция
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);
?>
Результат выполнения данного примера:
День смеха был 01/04/2003 Последнее Рождество было 24/12/2002
Пример #3 Рекурсивная обработка BB-кодов с помощью preg_replace_callback()
<?php
$input = "верх [indent] глубже [indent] еще глубже [/indent] глубже [/indent] верх";
function parseTagsRecursive($input)
{
$regex = '#\[indent]((?:[^[]|\[(?!/?indent])|(?R))+)\[/indent]#';
if (is_array($input)) {
$input = '<div style="margin-left: 10px">'.$input[1].'</div>';
}
return preg_replace_callback($regex, 'parseTagsRecursive', $input);
}
$output = parseTagsRecursive($input);
echo $output;
?>
Смотрите также
- Регулярные выражения PCRE
- preg_replace_callback_array() - Выполняет поиск и замену по регулярному выражению с использованием функций обратного вызова
- preg_quote() - Экранирует символы в регулярных выражениях
- preg_replace() - Выполняет поиск и замену по регулярному выражению
- preg_last_error() - Возвращает код ошибки выполнения последнего регулярного выражения PCRE
- Анонимные функции