Разбор вложенных тегов в файле - PullRequest
1 голос
/ 17 октября 2008

Мне интересно - Какой самый эффективный способ синтаксического анализа что-то вроде:

{{HEADER}}

Hello my name is {{NAME}}

{{#CONTENT}}
    This is the content ...

    {{#PERSONS}}

        <p>My name is {{NAME}}.</p>

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

Конечно, в конце концов это должно быть чем-то вроде шаблонной системы, поэтому я планирую создать хэш-карту для «наложения» на шаблон, как-то так

$hash = array(
    'HEADER' => 'This is a header',
    'NAME' => 'David',
    'CONTENT' => array('PERSONS' => array(array('NAME' => 'Heino'), array('NAME' => 'Sebastian')),
    'FOOTER' => 'This is the footer'
    );

Стоит заметить, что «разделы» (теги, начинающиеся с #) могут повторяться более одного раза, и я думаю, что это меня расстраивает ...

Кроме того, любой раздел может содержать любое количество других разделов и обычных тегов ...

Итак ... как ты это сделал?

Ответы [ 6 ]

1 голос
/ 18 октября 2008

Самый эффективный способ - скомпилировать шаблон в код php. И просто включает скомпилированную версию.

Smarty Template Engine делает нечто подобное. Вы также можете посмотреть на источник smarty и проверить, как они анализируют теги.

1 голос
/ 17 октября 2008

Ожидаемый результат этого что-то вроде:

Это заголовок

Здравствуйте, меня зовут Дэвид

This is the content ...

My name is Heino.

My name is Sebastian.

Это нижний колонтитул


Как вы управляете отношением вложенных массивов в хэш-карте к повторяемым разделам в шаблоне? Каково реальное поведение шаблона должно быть? Если для несекционного элемента предоставляется массив, что он будет делать? Если элементу раздела предоставлено одно значение, будет ли он обрабатываться так же, как массив с единственным элементом (я так полагаю)?

Во всяком случае, что касается парсера для шаблона (независимо от того, что вы в конечном итоге делаете с отображением данных) ... Что я хотел бы сделать, так это создать класс для каждого типа токена, включая универсальный для не содержание. Они наследуются от общего базового класса токенов с переопределяемыми методами Parse, Render и Map.

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

Если у вас есть это в абстрактной форме, вы можете перебрать коллекцию, вызывая Map для токенов, чтобы назначить данные из хэш-карты токенам, а затем вызвать Render, чтобы преобразовать шаблон в окончательную форму.

Надеюсь, это поможет.

0 голосов
/ 18 октября 2008

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

0 голосов
/ 17 октября 2008

Я бы использовал что-то вроде этого в отдельном файле .php:

<?php echo $HEADER ?>

Hello my name is <?php echo $NAME?>

<div id="CONTENT">
    This is the content ...

    <?php foreach ($PERSONS as $PERSON) : ?>

        <p>My name is <?php echo $PERSON['NAME']?>.</p>

    <?php endforeach ?>

</div>

<?php echo $FOOTER ?>

И просто включите указанный выше файл в тот, в котором указаны ссылочные переменные.

Верьте или нет, PHP уже предоставляет все функции, которые, как утверждают, реализуют системы шаблонов. Нет необходимости добавлять еще один уровень абстракции (и сложности) поверх PHP.

0 голосов
/ 17 октября 2008

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

Составной шаблон часто используется в среде Java для таких вещей, как синтаксический анализ XML.

0 голосов
/ 17 октября 2008

Вы бы лучше сделали ставку, используя что-то с существующим парсером, таким как XML или JSON, чтобы вам не приходилось писать свой собственный парсер, и чтобы другие могли легко писать документы для вашего парсера без использования специальных инструментов. Однако, если вы хотите написать свой собственный анализатор, вы, вероятно, захотите использовать Lex и Yacc .

...