Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Эти шаблонизаторы покоя не дают...
 
 автор: staglu   (20.10.2009 в 12:41)   письмо автору
 
 

Добрый день!

У меня тут проблемка...как и у многих проблемы с рег. выражениями.

Ну вообщем.
Под проект пишется шаблонизатор, заказчик не захотел использовать Smarty.(Вот теперь и изобретаем велосипед). Не получается извлечь правильно ветки IF.

Пример:
{if 1==1}
{if 2==2}
какой-то текст
{end if}
{end if}

Самое интересное вложенность работает. Казалось, все хорошо, но есть проблема!

Пример:

{if 1==1}
какой-то текст
{end if}

---какой-нибудь код дизайна---

{if 5==5}
Вывод текста
{end if}


Вот написанная конструкция ведет себя не корректно. При компиляции шаблона, получается:

<?php
if ( == )  {
  
какой-то текст


---какой-нибудь код дизайна---


 if ( 
== ) {
  
Вывод текста
 
}

}

?>


Вот рег. выражение которое мы используем:


<?php 
   preg_match_all
("/{[\\s]*if[\\s]*(.*)[\\s]*}[\\s]*(.*)[\\s]*{[\\s]*end[\\s]*if[\\s]*}/i",$tpl,$if);
?>


Можно как-нибудь извлекать все ветки и вложенные, а потом обрабатывать ветки одну за одной!?

Вроде и все!
Заранее всем спасибо!

  Ответить  
 
 автор: heed   (20.10.2009 в 14:27)   письмо автору
 
   для: staglu   (20.10.2009 в 12:41)
 

как-раз со вторым примером в результате оба совпадения
<pre><?
$txt
='
Пример:
{if 1==1}
какой-то текст
{end if}

---какой-нибудь код дизайна---

{if 5==5}
Вывод текста
{end if}
'
;
preg_match_all(
   
"/{\s*if\s*(.*)\s*}\s*(.*)\s*{\s*end\s*if\s*}/i"
   
,$txt,$if); 
print_r($if);
?>
чего нельзя сказать о первом примере

Непонятно почему именно preg_match_all(), а не например preg_replace_callback()
, непонятно так и должно-ли быть "Вывод текста" только в одну строку, в две не совпадёт
, непонятно как реализована эта самая поддержка вложенности.
или она ограничена только глубиной например 3 и такое preg_match_all() выполняется 3 раза
или мне ещё чего-то не понятно

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования