Ищем PHP шаблон Parser с вложенностью - PullRequest
1 голос
/ 01 мая 2010

Я ищу парсер PHP, который может это сделать.

{tag} Replace the tag with text coming from a function

{tag(params)} It must support params

{tag({tag(params)},{tag(params)})} It must support nesting

{tag()?

else

} It must support Tests

{$tag=value} It must support varriables

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

Или, может быть, вы знаете, как я могу его создать. Я пытался сделать это с помощью preg, но кажется, что невозможно создать вложение.

Smarty кажется слишком большим, и я не знаю, сможете ли вы отключить все дополнительные функции, которые у него есть. Мне нужна только та функциональность, которую я перечислил выше.

В Smarty вы можете писать PHP-код, и мне это не нравится. {php} {/ php} Так что, если я собираюсь использовать это, я должен быть в состоянии превратить это.

Я собираюсь использовать его с CodeIgniter.

Ответы [ 3 ]

0 голосов
/ 01 мая 2010

Я бы просто пошел с Smarty3. Зачем изобретать велосипед, если кто-то уже провел годы разработки, тестирования и оптимизации для вас?

В Smarty3 {php} тег по умолчанию отключен. Он также поддерживает политики безопасности , где вы можете отключить вызовы функций php, например, если вы разрешаете пользователям изменять ваши шаблоны.

0 голосов
/ 01 мая 2010

CodeIgniter сделал это очень хорошо, прежде чем вводить встроенные шаблоны. Шаблоны представления CodeIgniter раньше писались просто на PHP, и поэтому вы могли свободно использовать любые функции PHP, которые пожелаете: структуры вызовов, вызовы функций и многое другое.

Я рекомендую вам просто использовать Просмотр вместо Шаблон анализатора .

0 голосов
/ 01 мая 2010

Чтобы включить вложение в регулярные выражения, вы должны использовать рекурсивные шаблоны (? R). Это соответствует целому шаблону.

Чтобы найти самые внешние {} -ы в тексте (возможно, с некоторыми другими {} внутри них), вы должны использовать выражение вроде этого:

/{([^{}]*(?R))*[^{}]+}/

Вы можете прочитать о (? R) здесь: http://pl2.php.net/manual/en/regexp.reference.recursive.php

Там предложена конструкция {((?>[^{}]+)|(?R))*}. Возможно, более эффективный, чем тот, который я построил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...