нашел интересный баг. Запускать 10 раз. Раза 3 как минимум должна выскочить ошибка. PHP: <? include( './phparser.php' ); $tpl = new phparser( 'tpl' , 'cache' ); $tpl -> load( 'test' ); $tpl -> v( 'title' , 'PHParser example' ); if (rand(1,2) == 1) { $a = 0; } else { $a = 1; $loop = NULL; $loop[1]['link'] = 'http://ya.ru'; $loop[1]['title'] = 'Лучшая рашенская поисковая система'; $loop[1]['text'] = 'Яndex'; $loop[2]['link'] = 'http://google.com'; $loop[2]['title'] = 'Лучшая не рашенская поисковая система'; $loop[2]['text'] = 'Google'; $loop[3]['link'] = 'http://r0.ru'; $loop[3]['title'] = 'Советская поисковая система'; $loop[3]['text'] = 'Rамблер'; $tpl -> l( 'src' , $loop ); } $arr['rand'] = rand(1,2); $arr['year'] = date('Y'); $tpl -> arr( $arr ); $tpl -> re_cache(); ### while developing $tpl -> parse(); ?> HTML: [load header] Поисковые системы:<br> [if a] [loop src] <a href="[link]" title="[title]">[text]</a><br> [/loop] [/if] <br> Сейчас <font color="[if rand == 1]blue[else]red[/if]">[year]</font> год. [load footer] <br> оператор switch поддерживается? если нет, то хотелось бы. и еще: ' - апостроф а не слеш) + грамматические ошибки :wink:
Циклы подправил. Ночером попробую сделать свитч и выложу. Думаю что Экранирование тэгов теперь не актуально и я его попросту выкину. P.S. Спасибо за ошибки.
наткнулся в классе на метод __construct . Получается php5-only? Может лучше переименовать этот метод на phparser?
Koc Забей на PHP4, это уже не серьёзно. С августа поддержка PHP4 прекращается полностью, даже критические уязвимости чинить не будут. Так что хватит жить прошлым блин.
Psih я работаю под 5 версией. Просто если 1 строчка кода делает доступным и работу под 4 версией, то почему бы и нет?
Koc А потом начинается что не работает file_put_contents (кстати она у него используется), потому что его нету в PHP4, потом какая-нить array_* функция, а там нам нужно было private, а тут у нас объект передаётся по ссылке обязательно (а в PHP4 он копируется) и.т.д. Различия слишком велики, что бы думать о backward compability. Да, и тогда ему надо убрать все public, private (ибо Syntax Error в PHP4) Даже у нас в компании, у которой сотни проектов реализованы и часть их них долгосрочные (5+ лет), с прекращением поддержки PHP4 мы больше не соблюдаем совместимость (по сути уже не соблюдаем) - хотите что бы работало - обновляйте сервер или не обновляйте ядро системы. Хотите что-то добавить - не проблема, но поставьте PHP5. И это не смотря на то, что мы живём только на разработках на PHP как на местный рынок так и на американский (список проектов, и то не весь, здесь). Именно из-за таких совмещенцев как ты и тормозилось внедрение PHP5 целых 5 лет.
Danilka PHP: <?php $data = str_replace( '||' , ' || ' , $data ); $data = str_replace( '&&' , ' && ' , $data ); $data = str_replace( '"' , '' , $data ); $data = str_replace( '{' , '' , $data ); $data = str_replace( '}' , '' , $data ); $data = str_replace( ';' , '' , $data ); $data = str_replace( '$' , '' , $data ); $data = str_replace( '(' , ' ( ' , $data ); $data = str_replace( ')' , ' ) ' , $data ); $data = str_replace( '!' , ' ! ' , $data ); $data = str_replace( '=' , ' = ' , $data ); $data = str_replace( '>' , ' > ' , $data ); $data = str_replace( '<' , ' < ' , $data ); // лучше так $search = Array('||', '&&', '"', '{', '}', ';', '$', '(', ')', '!', '=', '>', '<'); $replace = Array(' || ', ' && ', '', '', '', '', '', ' ( ', ' ) ', ' ! ', ' = ', ' > ', ' < '); $data = str_replace($search, $replace, $data); А ещё я не понял смысла таких замен вообще, и зачем заменять два пробела на один и.т.д.? Смысл?
Запостил новую версию! Как всегда, качаем на сайте. Появился долгожданный свитч! Исправил теги. Спасибо Psihу, исправил замену. Не знал, что так можно делать. Кстати, смысл замены простой. Поддержка тегов вида [if my_var!='my_val'] или [if my_var ! = 'my_val'] Я конечно заявлял, что никакие глюки кода не исправляются, но это уж так, совсем не существенные различия, так что, решил, что лишним не будет. Про php4/5 Psih всё сказал, смыла дальше развивать тему нет смысла.
Danilka Эм, смысла поддерживать ! = нету, потомучто это просто ошибка писавшего тег, тоесть syntax error. Так что ты это очень и очень зря. Да и пробелы с двойных заменять на одинарный тоже ИМХО глупо, проще просто написать парсер так, что бы ему было всёравно на количество пробелов и табов.
Psih, про пофегизм на пробелы - резонно, подумаю в эту сторону. При написании я ориентировался на то, что шаблон будет парситься придельно редко и затраты ресурсов при этом практически не учитывал. Но в то же время не парился по поводу обработки ошибок, бо подразумевается, что девелоперу нужно доверять. Сейчас думаю написать две версии при работе с файлами. Одну для дева + дописать обработку ошибок в шаблонах. А другую для работы. Вообще без парсера шаблонов.
Подумал тут выкинуть прямой вывод шаблона и отдать результат в виде ретёна, чтобы программист уже сам дальше решал, что с ним делать. Возник вопрос, а как это реализовать? Бо Сам вывод осуществляется при помощи подключения php файла. Единственное, что пришло в голову, сделать так: PHP: ob_start(); include( 'my_template.ch' ); return( ob_get_contents() ); ob_end_clean(); Но! Это перекрывает некоторые возможности пользования буфером вывода в теле основного скрипта. Нет какого-нибудь иерархичного буфера или ещё чего?
Буферы вывода в ПХП и так "иерархичны", нет, ты не перекроешь основной буфер. Так что делай на здоровье.
PHP: ob_start(); include( 'my_template.ch' ); return( ob_get_contents() ); ob_end_clean(); Это шо? PHP: ob_start(); include( 'my_template.ch' ); return( ob_get_clean() );
PHP: <? function get_out($data){ ob_start(); echo $data; // include( 'my_template.ch' ); // ну илb любой другой вывод $out=ob_get_contents(); ob_end_clean(); return $out; }
а конструкция типа [:load [:add:]:] не поддерживается чтоли? То есть мы в шаблоне указываем загружать шаблон, имя которого находится в переменной add. Простите за тавтологию
Нет, не поддерживается, если сделать, то будут траблы с отличением переменной от не переменной. А так как мы всё-таки пришли к модели, что не все переменные могут быть быть определены, то это нарушит такое представление. P.S. Как вообще использование? Написал что-то? Да, кста, я что-то не могу буфер вывода сделать. Если делать его вложенным, то он получается до первого оутбуфера работает, где обещанная иерархичность?
ну я человеку одному написал что он просил. Себе же сейчас пишу одну штуку. Пользоваться удобно. Хочу кеширование html)
Код (Text): Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 471 Поисковые системы: Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 234 Яndex Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 234 Google Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 234 Rамблер версия 0.6 альфа. ничего не сделал, только запустил
Странно, у меня таких ошибок не выдаёт... Может у тея какой экстра эррор Подправил чуток, попробуй сейчас. Версия та же, лежит там же, просто перезалил и дату исправил.
Есть такой шаблон: HTML: <div id="lCol"> [:lCol:] <h3><img src="images/32/delete.png" alt="" /> Удалить кафедру</h3> [:if allowDelete:] <div class="message"> <form name="province" method="post" action="adminRecive.php?do=deleteSave&delete=chair&id=[:deleteID:]"> Вы действительно хотите удалить кафедру: [:title:]?<br /><br /> [:if redirectTo:]<input type="hidden" name="redirectTo" value="[:redirectTo:]" />[:/if:] <input type="submit" name="allowDelete" value="да" /> <input type="submit" name="denyDelete" value="нет" /> </form> </div> <!-- [:else:] [:if showUniversity:] Есть вузы, входящие в состав этого города:<br /> [ load list-loop-univercity ] [:/if:] [:if error:]<span class="error">[:error:]</span>[:/if:] --> [:/if:] </div> хочется, чтобы поддерживались комментарии в стиле html. То, что закомментировано - не парсить (а может даже и не выводить. Тупо вырезать). Оно тут очень наглядно показано - серым выделено.