Как использовать 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 часа работы над этим, я просто не могу заставить его работать.

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

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

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

Примечание . Следующее предназначено для общего ответа и не пытается решить конкретную проблему 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::createFromFormat() и DateTime::format() . Этот вопрос имеет более подробную информацию.