Подтвердить что ты не робот

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

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

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

То, что я пытаюсь сделать, это заменить теги [otsection] на html div. Уловкой я хочу увеличить id 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_callback для увеличения переменной id между каждой заменой. Но после 1 часа работы над этим, я просто не могу заставить его работать.

Любая помощь с этим будет высоко оценена!

4b9b3361

Ответ 1

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

$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);

Ответ 2

Примечание. Следующее предназначено для общего ответа и не пытается решить конкретную проблему 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]). Функция callback будет вызываться и передан массив согласованных элементов в данной строке.

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

22-02-2014

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