preg_replace_callback

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

preg_replace_callbackВыполняет поиск по регулярному выражению и замену с использованием callback-функции

Описание

preg_replace_callback(
    string|array$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

$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 вернётся неизмененным.

Ошибки

Если передали шаблон регулярного выражения, который не компилируется в допустимое регулярное выражение, выдаётся ошибка уровня E_WARNING.

Список изменений

ВерсияОписание
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] - полное вхождение шаблона

Результат выполнения приведённого примера:

День смеха был 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;
?>

Смотрите также

To Top