|
|
|
| Добрый день!
У меня тут проблемка...как и у многих проблемы с рег. выражениями.
Ну вообщем.
Под проект пишется шаблонизатор, заказчик не захотел использовать Smarty.(Вот теперь и изобретаем велосипед). Не получается извлечь правильно ветки IF.
Пример:
{if 1==1}
{if 2==2}
какой-то текст
{end if}
{end if}
Самое интересное вложенность работает. Казалось, все хорошо, но есть проблема!
Пример:
{if 1==1}
какой-то текст
{end if}
---какой-нибудь код дизайна---
{if 5==5}
Вывод текста
{end if}
Вот написанная конструкция ведет себя не корректно. При компиляции шаблона, получается:
<?php
if ( 1 == 1 ) {
какой-то текст
---какой-нибудь код дизайна---
if ( 5 == 5 ) {
Вывод текста
}
}
?>
|
Вот рег. выражение которое мы используем:
<?php
preg_match_all("/{[\\s]*if[\\s]*(.*)[\\s]*}[\\s]*(.*)[\\s]*{[\\s]*end[\\s]*if[\\s]*}/i",$tpl,$if);
?>
|
Можно как-нибудь извлекать все ветки и вложенные, а потом обрабатывать ветки одну за одной!?
Вроде и все!
Заранее всем спасибо! | |
|
|
|
|
|
|
|
для: 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 раза
или мне ещё чего-то не понятно | |
|
|
|