Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как сделать замену по регулярному выражению?
Форумы портала PHP.SU » PHP » Регулярные выражения » Как сделать замену по регулярному выражению?

Страниц (1): [1]
 

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



Код выше просто выводит {{ $message }} пять раз. И все хорошо, но если использовать вложенные циклы, например:

PHP:
скопировать код в буфер обмена
  1. [[ @times(5) ]]
  2.   [[ @times(2) ]]
  3.     <p>{{ $message }}</p>
  4.   [[ @times(#end) ]]
  5. [[ @times(#end) ]]



то результат будет таким:

PHP:
скопировать код в буфер обмена
  1. [[ @times(5) ]]
  2.     Hello world!
  3.     Hello world!
  4. [[ @times(#end) ]]



Как сделать чтобы внутренний цикл срабатывал нормально?

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


Тут я просто ищу все конструкии такого вида [[ @times(n) ]] Some text... [[ @times(#end) ]], и вывожу их n раз
Как сделать чтобы внутренний цикл срабатывал нормально?

UPD: Переменная $message равна "Hello world!"
2. andrewkard - 28 Сентября, 2018 - 16:13:17 - перейти к сообщению
hivuld пишет:
Как сделать чтобы внутренний цикл срабатывал нормально?

Попахивает рекурсией.
3. LIME - 28 Сентября, 2018 - 22:05:21 - перейти к сообщению
лучше собирать шаблоны в php кэш заменяя на php инструкции
как делают нормальные фрэймворки/шаблонизаторы
(Добавление)
+ выигрыш по перформансу
иначе получается интерпретация интерпретатора))
еще и в рекурсии
(Добавление)
разовьем про интерпретацию
компилируемые языки компилируются и выполняются как готовая прога
интерпретируемые выполняются отдельной программой интерпретатором
медленно зато изменения вносятся на лету
так вот
получается интерпретатор php у тебя выполняет php код который выполняет твой шаблонизатор
так можно бесконечно))
смысл шаблонизатора в том чтобы разделить логику и представление
защита от xss
отсутствие сложной логики в представлении и перенос ее ниже(разделение) итдитп
не надо шаблонизатор выполнять
лучше его собирать
кактотак

 

Powered by ExBB FM 1.0 RC1