Вопрос по preg-replace-callback, php, preg-replace – Как использовать preg_replace_callback?

29

У меня есть следующее заявление HTML

[otsection]Wallpapers[/otsection]
WALLPAPERS GO HERE

[otsection]Videos[/otsection]
VIDEOS GO HERE

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

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

Ваш Ответ

2   ответа
26

Note: The following is intended to be a general answer and does not attempt to solve the OP's specific problem as it has already been addressed before.

What is preg_replace_callback()?

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

When should I use it?

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

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

How to use it?

Вот пример, иллюстрирующий использование функции. Здесь мы пытаемся преобразовать строку даты из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

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

44

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

$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);
Как ты мог получить$in заселено предметом?
@MichaelProbst Вот почему вы должны обновить версию PHP, которая поддерживает анонимные функции (5.3 или новее). Если вы все еще используете 5.2, у вас больше проблем, чем у заблудшего.eval замаскированный;)
Спасибо, это выглядит великолепно и должно работать, но я продолжаю получать неожиданную ошибку T_FUNCTION, но все кавычки и экранированные кавычки выглядят хорошо.ideone.com/K71TV Mark
@SheikhHeera Это уже должно быть там. Я обычно использую$in а также$out чтобы показать, куда данные входят и выходят.
В любом случае, хороший ответ.

Похожие вопросы