За последние 24 часа нас посетили 20428 программистов и 1092 робота. Сейчас ищут 850 программистов ...

Как сделать замену по регулярному выражению?

Тема в разделе "Регулярные выражения", создана пользователем artmirartem, 25 сен 2018.

  1. artmirartem

    artmirartem Новичок

    С нами с:
    25 сен 2018
    Сообщения:
    7
    Симпатии:
    0
    Здравствуйте. Я пытаюсь сделать на php свой шаблонизатор, сейчас я делаю цыклы. Вот пример цикла:
    Код (Text):
    1. [[ @times(5) ]]
    2.   <p>{{ $message }}</p>
    3. [[ @times(#end) ]]

    Код выше просто выводит {{ $message }} пять раз. И все хорошо, но если использовать вложенные циклы, например:
    Код (Text):
    1. [[ @times(5) ]]
    2.   [[ @times(2) ]]
    3.     <p>{{ $message }}</p>
    4.   [[ @times(#end) ]]
    5. [[ @times(#end) ]]
    то результат будет таким:
    Код (Text):
    1. [[ @times(5) ]]
    2.     Hello world!
    3.     Hello world!
    4. [[ @times(#end) ]]
    Как сделать чтобы внутренний цикл срабатывал нормально?

    Я использую следующий код обработки таких конструкций:
    Код (Text):
    1. public static function dirs($code, $data) {
    2.     $pattern = '/\[\[\s*@([^\(]+)\(([^\)]+)\)\s*\]\]([^\[]+)\[\[\s*@([^\(]+)\(#end\)\s*\]\]/i';
    3.     return preg_replace_callback($pattern, function($value) use($data) {
    4.       if($value[1] == 'times') return str_repeat($value[3], $value[2]); // $value[3] - строка <p>{{ $message }}</p>, $value[2] = 5;
    5.     }, $expression);
    6.   }
    Тут я просто ищу все конструкии такого вида [[ @times(n) ]] Some text... [[ @times(#end) ]], и вывожу их n раз
    Как сделать чтобы внутренний цикл срабатывал нормально?

    PS: Переменная $message равна "Hello world!"
     
  2. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    605
    Симпатии:
    130
    Сделать компиляцию шаблона в PHP-файл, заменяя
    Код (Text):
    1. [[ @times(5) ]]
    на уникальные
    Код (Text):
    1. <?php for ($i1 = 0, $i1 < 5, $i1++): ?>
    и запуская этот файл через include.