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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
hivuld
Отправлено: 25 Сентября, 2018 - 13:22:39
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Дек. 2017  


Помог: 0 раз(а)




Здравствуйте. Я пытаюсь сделать на 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!"
 
 Top
andrewkard
Отправлено: 28 Сентября, 2018 - 16:13:17
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




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

Попахивает рекурсией.
 
 Top
LIME
Отправлено: 28 Сентября, 2018 - 22:05:21
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




лучше собирать шаблоны в php кэш заменяя на php инструкции
как делают нормальные фрэймворки/шаблонизаторы
(Добавление)
+ выигрыш по перформансу
иначе получается интерпретация интерпретатора))
еще и в рекурсии
(Добавление)
разовьем про интерпретацию
компилируемые языки компилируются и выполняются как готовая прога
интерпретируемые выполняются отдельной программой интерпретатором
медленно зато изменения вносятся на лету
так вот
получается интерпретатор php у тебя выполняет php код который выполняет твой шаблонизатор
так можно бесконечно))
смысл шаблонизатора в том чтобы разделить логику и представление
защита от xss
отсутствие сложной логики в представлении и перенос ее ниже(разделение) итдитп
не надо шаблонизатор выполнять
лучше его собирать
кактотак
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB