Разбор файла шаблона с C ++ - PullRequest
0 голосов
/ 08 декабря 2010

Недавно я был занят некоторыми PHP-фреймворками - кстати, совершенно не по теме.

Во всяком случае, у меня есть конкретные файлы html / template, которые я хотел бы проанализировать с C ++ (не спрашивайте меня, почему, просто потому, что я хочу написать это на C ++). Кроме того, это могло бы быть первой полезной вещью, которую я когда-либо написал на C ++.

В любом случае, чтобы вернуться к проблеме, представьте, что у меня есть файл, подобный следующему:

<table>
    <tr>
        <th>ID</th>
        <th>Title</th>
        <th>Actions</th>
    </tr>
    {foreach from="$pages => $page"}
    <tr>
        <td>{$page.Id()}</td>
        <td>{$page.Title()}</td>
        <td><a href="page/edit/{$page.Id()}/">Edit</a> | <a href="page/delete/{$page.Id()}/">Delete</a></td>
    </tr>
    {foreachelse}
    <tr>
        <td colspan="3">There are no pages to be displayed</td>
    </tr>
    {/foreach}
</table>

И вывод должен быть:

<table>
    <tr>
        <th>ID</th>
        <th>Title</th>
        <th>Actions</th>
    </tr>
    <?php if(count($pages) > 0): ?>
    <?php foreach($pages as $page): ?>
    <tr>
        <td><?php echo $page->getId(); ?></td>
        <td><?php echo $page->getTitle(); ?></td>
        <td><a href="page/edit/<?php echo $page->getId(); ?>/">Edit</a> | <a href="page/delete/<?php echo $page->getId(); ?>/">Delete</a></td>
    </tr>
    <?php endforeach; ?>
    <?php else: ?>
    <tr>
        <td colspan="3">There are no pages to be displayed</td>
    </tr>
    <?php endif; ?>
</table>

Почему я это делаю, вам может быть не совсем понятно, но это остается проблемой, применимой где-то еще в любом случае.

Во всяком случае, требуются некоторые прямые и обратные поиски и модификации в выходных файлах. Как правильно подойти к этой проблеме?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2010

Вы можете написать парсер ручной работы, который может быть нетривиальным, в зависимости от ваших реальных требований.Ваша следующая лучшая ставка - использовать BNF-подобные синтаксические анализаторы C ++, например, boost :: spirit, так что вам не нужно самостоятельно разбирать правила обработки.Вам все еще нужно будет написать правильные семантические действия для преобразования {...} в php.

1 голос
/ 08 декабря 2010

Правильный подход, на мой взгляд, состоит не в том, чтобы заново изобрести колесо (т.е. написание собственного синтаксического анализатора), а в существующей библиотеке, которая сделает его более простым и менее трудоемким для вас. Одной из этих библиотек C ++ может быть wxHTMLParser или wxHTML .

0 голосов
/ 09 декабря 2010

Для такого типа проблем я склонен склоняться к REGEX.Использование boost::regex или классов регулярных выражений GNU или любой другой библиотеки.Идентификация этих маркеров и их преобразование - это в основном поиск и замена регулярных выражений (с параметрами для имен переменных, значений и т. Д.), И вам не нужно писать код для фактического анализа всего HTML и специальных вставок.

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