Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения (шаблонизатор) 
:(
    Опции темы
Гость_Frikazoid
Дата 20.8.2005, 16:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Доброго времени суток!
Стоит задача состоит в том чтобы правильно отпарсить условные операторы с вложенностью!

Есть вот такое!
Код

<?php
$str='{if test}(test string {if subtest}subtest string{endif} first){endif} ggg hhh {if test2}test2{endif}';

$str=preg_replace('/({if test}(.*(({if .*}.*{endif})+).*){endif})/Uims','\\2',$str);
echo $str.'<br>';
$str=preg_replace('/({if subtest}(.*(({if .*}.*{endif})+).*){endif})/Uims','\\2',$str);
echo $str;
?>


На выходе должен получить
Код

(test string {if subtest}subtest string{endif} first) ggg hhh {if test2}test2{endif}
(test string subtest string first) ggg hhh {if test2}test2{endif}


а получаю
Код

(test string {if subtest}subtest string{endif} first) ggg hhh {if test2}test2{endif}
(test string {if subtest}subtest string{endif} first) ggg hhh {if test2}test2{endif}

Если переписать внутреннюю часть регекспа как (.*(({if .*}.*{endif})*).*) то он сразу начнёт страдать жадностью....

Заранее спасибо за помощь!
  Вверх
Mal Hack
Дата 20.8.2005, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Тут дело не только в регулярках. Помимо того, чтобы просто достать условия и т.п., надо их еще выполнять... Так что тут одними рэгами не обойдешься.
PM ICQ   Вверх
Гость_Frikazoid
Дата 20.8.2005, 17:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Mal Hack: =)
Я свой шаблонизатор пишу! =)
Дискусию по поводу нужности не стоит разводить! мне со своим работать удобнее! =) Написал уже 5 сайтов на своём ДЕТИЩЕ! =)
Раньше писал конструкции вида {if error}error{endif error}! И проблем вообще не наблюдалось! =) Но хочется сделать шаг в сторону нормального парсинга! Мне собственно регексп интересует! С остальной логикой я разберусь....

  Вверх
Mal Hack
Дата 20.8.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Ты меня не так понял. Я имел ввиду, что достав if надо их проверить, т.е. выполнить сами условия. А это уже не регулярками делать а callback функцией
PM ICQ   Вверх
Гость_Frikazoid
Дата 20.8.2005, 18:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Mal Hack
Ёкарный бабай! =) У меня шаблонизатор работает не на пост обработке! =)
Т.е. я ему пихаю конструкцию вида $skin->setif('error', true);
в этой ф-и....
Код

if($value) $f=preg_replace('/({if '.$param.'}|{endif '.$param.'})|({else '.$param.'}(.*){endelse '.$param.'})/Uims','',$f);
else $f=preg_replace('/({if '.$param.'}(.*){endif '.$param.'})|({else '.$param.'}|{endelse '.$param.'})/Uims','',$f);

Словом мне только дай тот регексп! =)
Буду многоблагодарен! =) На самом деле у меня поддерживается не только булеан условия....
Есть и то про что ты говоришь! =) но мне надо для начала на булеанах откатать!
  Вверх
Frikazoid
Дата 20.8.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



Самое интересное что шаблонизатор весь работает на регулярках я в них слабо разбираюсь! =\


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Frikazoid
Дата 21.8.2005, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



Ндя. Чую этот вопрос затянется....


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 21.8.2005, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Frikazoid еще раз поясни что тебе нужно. Просто я понял это так, что тебе надо достать все ифы и т.п. и их проверить и заменить на то, на что нужно. Или я не прав?
PM ICQ   Вверх
Frikazoid
Дата 21.8.2005, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



Mal Hack нет! мне надо правильно удалять тэги!

К примеру {if error}error {if sqlerror}sql{endif} on page {endif}
так вот! мне надо просто удалить {if error} {endif} чтобы остался только {if sqlerror}sql{endif}
надеюсь понятно расписал? я никогда не отличался хорошим объяснением! не быть мне учителем! =)


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 21.8.2005, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Так, уже лучше.
Теперь скажи. error всегда? И всегда надо оставить только один вложенный if?
PM ICQ   Вверх
Frikazoid
Дата 22.8.2005, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



Mal Hack Я же привел только пример! =)
тестовый скрипт! =)
вложенных тэгов внутри может быть много.... а может и не быть вообще....
а может быть и мультивложенность! в том то и прикол...
Добавлено @ 00:17
Цитата(Mal @ 21.8.2005, 10:32)
error всегда
нет. в шаблонизаторе я делаю подстановку...
просто пример привёл...



--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 22.8.2005, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Попробуй так:
Код

<?php
$str='{if test}(test string {if subtest}subtest string{endif} first){endif} ggg hhh {if test2}test2{endif}';
echo $str.'<br>';
$str = preg_replace( "#(\{if test\})((.*?)\{if.+?\}(.*?)\{endif\}(.+?))+(\{endif\})#is" , "\\1\\3\\4\\5\\6" , $str );
echo $str.'<br>';
?>

PM ICQ   Вверх
Frikazoid
Дата 22.8.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 29.3.2002

Репутация: нет
Всего: 2



Эмс....
допустим на этой строке {if test}(test string first){endif} ggg hhh {if test2}test2{endif}
работать не будет!
и на этой....
{if test}(test string {if subtest}subtest {if tt}tt{endif} string{endif} first){endif} ggg hhh {if test2}test2{endif}

вот этот регексп str = preg_replace( "#(\{if test\}(.*?\{if.+?\}.*?\{endif\}.+?)+\{endif\})#is" , "\\2" , $str );
работает правильно для
{if test}(test string {if subtest}subtest string{endif} first){endif} ggg hhh {if test2}test2{endif}
но для
{if test}(test string {if subtest}subtest {if tt}tt{endif} string{endif} first){endif} ggg hhh {if test2}test2{endif}
работать не будет.

ндя.
чую это регулярками не сделать... либо делать c preg_match_all .....

Добавлено @ 14:27
Печально.....
тут вобщем проблема в том что надо замутить парное соответствие внутренних условий!
т.е. {if param} что угодно тут и как можно ближе {endif}


--------------------
RTFM - "Всё для программиста" Это уменя есть сайт! Урыл в профайле!
А там.... Ну всё что надо по PHP Delphi CSS HTML JavaScript Perl API ASP MySQL XML С++ VBasic и многое другое.
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 22.8.2005, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Посмотри, как это в Смарти реализованно. Там вроде есть что-то подобное.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.3637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.