PHP парсер вложенных шаблонов - PullRequest
0 голосов
/ 22 июля 2011

Мне нужен анализатор шаблонов PHP, который может анализировать следующий формат:

{users}
    {name}
    {age}
    {posts}
        {title}
        {body}
        {comments}
            {comtitle}
            {combody}
        {/comments}
    {/posts}
{/users}

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

Верьте или нет, нет синтаксических анализаторов в этом сообщении в блоге , кажется, в состоянии сделать это. Некоторые могут достичь этого, но с синтаксисом, который приближается к нативной функции foreach в PHP.

Вы знаете, существует ли парсер? Или вы создали тот, который читает этот тип структуры? Нужный синтаксический анализатор должен иметь возможность копаться бесконечно, при условии, что ему был предоставлен еще более вложенный массив.

В частности, я ищу решение CodeIgniter, но на данном этапе достаточно любого решения PHP, так как я изучал это уже несколько дней.

Спасибо!

Ответы [ 3 ]

1 голос
/ 22 июля 2011

Как написано, этот формат выглядит невозможным для анализа. Нет никакого способа отличить {tag}, который будет иметь совпадение {/tag} (например, {posts}), и тот, который не будет (например, {body}).

Не пытайтесь изобретать велосипед. Существует множество хороших анализаторов шаблонов, а также сам PHP. Если вы не действительно хороши, все, что вы придумали, вероятно, не будет столь же функциональным или быстрым, как то, что уже есть.

0 голосов
/ 25 января 2013

«У меня нет тестов, подтверждающих это, но я бы предположил, что это шутка для компьютера».@ Джордан Арсено

Джордан, я согласен.Хотя, если у вас есть несколько файлов для анализа одновременно, все это может сложиться довольно плохо.Я согласен с тем, что у вас есть собственный синтаксический анализатор шаблонов, если у вас есть для этого особые потребности.Хотя использование немного другого синтаксиса может сэкономить вам много времени на обработку при синтаксическом анализе ...

Вместо использования этой версии:

{users}
    {name}
    {age}
    {posts}
        {title}
        {body}
        {comments}
            {comtitle}
            {combody}
        {/comments}
    {/posts}
{/users}

Вы также можете использовать что-то вроде:

{foreach: users}
    {name}
    {age}
    {foreach: posts}
        {title}
        {body}
        {foreach: comments}
            {comtitle}
            {combody}
        {endforeach: comments}
    {endforeach: posts}
{endforeach: users}

Таким образом, находя шаблон {foreach:<array>}, вы будете ЗНАЕТЕ, что есть соответствующий тег, и вам не нужно будет ПОПЫТЬ, чтобы найти один для всех шаблонов.После этого вы можете легко использовать preg_match(), чтобы пробиться.

(Примечание: вы все равно можете сделать то же самое со своим стилем, хотя вам придется анализировать код в обратном направлении, что, по-моему, сделает его действительно неудобным.)

0 голосов
/ 24 июля 2011

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

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

Вместо: <?php echo $variable; ?>

Можно написать: <?=$variable?>

Посмотрите, насколько близко это подходит к стандартному языку шаблонов: {variable}

Начните использовать PHP Альтернативный синтаксис для управляющих структур , чтобы ваш код не был завален операторами echo и длинными PHP-строками HTML.

IMO это шаблонное решение. Хотя ваши дизайнеры будут ненавидеть вас за представление:

if, elseif, endif, foreach и endforeach, часовая дискуссия с ними, объясняющая, как они работают с примерами, даст вам наибольшую гибкость в ваших взглядах.

Сходи с ума!

...