Привет всем,
Мне нужно оптимизировать 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!