Нужно оптимизировать RegEx для парсера шаблонов - PullRequest
0 голосов
/ 08 октября 2010

Привет всем,

Мне нужно оптимизировать RegEx, который я использую для анализа тегов шаблонов в моей CMS. Тег может быть либо одним тегом, либо соответствующей парой. Пример некоторых тегов:

{static:input:title type="input"}

{static:image:picture}<img src="{$img.src}" width="{$img.width}" height="{$img.height"} />{/static:image:picture}

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

{static([\w:]*)?\s?(.*?)}(?!"|')(?:((?:(?!{static\1).)*?){/static\1})?

Когда это соответствует тегу, группа 1 - это параметры, которые являются всеми словами, разделенными двоеточиями. Группа 2 это параметры. И группа 3 (если это пара тегов) - это содержимое между каждым тегом.

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

{if "{static:image:image1}"!=""}
    <a href="{static:image:image1}" rel="example_group" title="Image 1"></a></li>
{/if}

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

{static:image:picture}
{static:image:picture}<img src="{$img.src}" width="{$img.width}" height="{$img.height"} />{/static:image:picture}

Должно быть два отдельных матча. Первый матч будет иметь только группу 1. Второй матч будет иметь группу 1 и группу 3.

Если кому-то нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать. CMS построен на PHP с использованием фреймворка CakePHP.

Слава всем, кто может мне помочь: D!

Ответы [ 2 ]

1 голос
/ 08 октября 2010

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

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

0 голосов
/ 10 октября 2010

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

Предположение, что dogmatic69 придумал, могло бы быть более полным исправлением в дальнейшем.

Спасибо всем за ваши предложения и возможные решения.

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