Как использовать обратный вызов preg replace?


У меня есть следующий HTML-оператор

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

Что я пытаюсь сделать, так это заменить теги [otsection] на html-разделитель. Загвоздка в том, что я хочу увеличить идентификатор div с 1->2->3 и т. Д.

Так, например, приведенное выше утверждение следует перевести в

<div class="otsection" id="1">Wallpapers</div>
WALLPAPERS GO HERE

<div class="otsection" id="2">Videos</div>
VIDEOS GO HERE

Насколько я могу судить, лучший способ сделать это - с помощью обратного вызова preg_replace_ для увеличения переменной id между каждой заменой. Но после 1 часа работы над этим я просто не могу понять работающий.

Любая помощь в этом была бы очень признательна!

Author: Mark, 2012-06-24

2 answers

Используйте следующее:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    function($m) {
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    },
    $in);

В частности, обратите внимание, что я использовал переменную static. Эта переменная сохраняется при всех вызовах функции, что означает, что она будет увеличиваться при каждом вызове функции, что происходит при каждом совпадении.

Также обратите внимание, что я добавил ots к идентификатору. Идентификаторы элементов не должны начинаться с цифр.


Для PHP до версии 5.3:

$out = preg_replace_callback(
    "(\[otsection\](.*?)\[/otsection\])is",
    create_function('$m','
        static $id = 0;
        $id++;
        return "<div class=\"otsection\" id=\"ots".$id."\">".$m[1]."</div>";
    '),
    $in);
 41
Author: Niet the Dark Absol, 2012-06-24 03:58:32

Примечание: Следующее предназначено для общего ответа и не пытается решить конкретную проблему OP, как это уже было рассмотрено ранее.

Что такое preg_replace_callback()?

Эта функция используется для выполнения поиска и замены регулярного выражения. Это похоже на str_replace(), но вместо простых строк он ищет определенный пользователем шаблон регулярного выражения, а затем применяет функцию обратного вызова на совпадающих предметах. Функция возвращает измененную строку, если найдены совпадения, в противном случае неизмененную строку.

Когда я должен его использовать?

preg_replace_callback() очень похож на preg_replace() - единственное отличие состоит в том, что вместо указания строки замены для второго параметра вы указываете функцию callback.

Используйте preg_replace(), если вы хотите выполнить простой поиск и замену регулярных выражений. Используйте preg_replace_callback(), когда вы хотите сделать больше, чем просто заменить. Смотрите пример ниже для понимания того, как это работает.

Как им пользоваться?

Вот пример, иллюстрирующий использование функции. Здесь мы пытаемся преобразовать строку даты из формата YYYY-MM-DD в DD-MM-YYYY.

// our date string
$string  = '2014-02-22';

// search pattern
$pattern = '~(\d{4})-(\d{2})-(\d{2})~';

// the function call
$result = preg_replace_callback($pattern, 'callback', $string);

// the callback function
function callback ($matches) {
    print_r($matches);
    return $matches[3].'-'.$matches[2].'-'.$matches[1];
}

echo $result;

Здесь наш шаблон регулярного выражения ищет строку даты формата NNNN-NN-NN, где N может быть цифрой в диапазоне от 0 - 9 (\d является сокращенным представлением для класса символов [0-9]). Будет вызвана функция обратного вызова и передал массив совпадающих элементов в заданной строке.

Конечным результатом будет:

22-02-2014

Примечание: Приведенный выше пример предназначен только для иллюстрации. Вы не должны использовать для анализа дат. Использовать DateTime::createFromFormat() и DateTime::format() вместо этого. Этот вопрос содержит более подробную информацию.

 22
Author: Amal Murali, 2017-05-23 11:53:38