2008-10-17 2 views
1

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

{{HEADER}} 

Hello my name is {{NAME}} 

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

    {{#PERSONS}} 

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

    {{/PERSONS}} 

{{/CONTENT}} 

{{FOOTER}} 

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

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

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

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

Итак, как вы это сделали?

ответ

1

ли ожидаемый выход этого что-то вроде:

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

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

This is the content ... 

My name is Heino. 

My name is Sebastian. 

Это сноска


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

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

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

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

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

+0

Если ничто не «подходит» для тега, тег следует игнорировать и удалять. В противном случае мне нравится ваша идея - хотя это может быть немного сложнее, чем я думал изначально. – David 2008-10-17 19:12:00

0

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

0

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

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

0

Я хотел бы использовать что-то вроде этого внутри .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

Да, это было бы просто, но этого недостаточно, если я вхожу. Никакая PHP/логика не может быть встроена в шаблоны вообще. – David 2008-10-17 20:13:18

+0

Я предполагаю, что ваш запрос на отсутствие логики PHP исходит из того, что шаблоны будут генерироваться не-программистами. Но я уверен, что если вы сможете научить их писать {{#PERSONS}}, когда нужна итерация для каждого человека, вы также можете научить их писать эквивалент foreach. – 2008-10-18 08:10:07

0

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

1

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

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

Смежные вопросы