需要针对模板分析器优化RegEx

时间:2010-10-08 03:41:32

标签: php regex cakephp

问候全部,

我需要优化我用来解析CMS中模板标签的RegEx。标签可以是单个标签或匹配对。一些标签的示例:

{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}

需要有两个单独的比赛。第一场比赛只有第一场比赛。第二场比赛将有第一组和第三组。

如果有人需要更多信息,请不要犹豫。 CMS使用CakePHP框架在PHP中构建。

对任何可以帮助我的人都有很大的荣誉:D!

2 个答案:

答案 0 :(得分:1)

您的语法对于正则表达式而言过于复杂。你需要一个无上下文的语法。 (阅读Chomsky hierarchy以了解原因。)

我建议使用现有的模板语言(例如Smarty),而不是发明自己的模板语言。

答案 1 :(得分:0)

我想出了一个现在非常好用的解决方案。我先经历并抓住所有配对标签,然后抓住单个标签。然后我使用PHP在其他标记内容中执行标记的递归方面。

dogmatic69提出的建议可能是一个更完整的解决方案。

感谢大家的建议和可能的解决方案。