问候全部,
我需要优化我用来解析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!
答案 0 :(得分:1)
您的语法对于正则表达式而言过于复杂。你需要一个无上下文的语法。 (阅读Chomsky hierarchy以了解原因。)
我建议使用现有的模板语言(例如Smarty),而不是发明自己的模板语言。
答案 1 :(得分:0)
我想出了一个现在非常好用的解决方案。我先经历并抓住所有配对标签,然后抓住单个标签。然后我使用PHP在其他标记内容中执行标记的递归方面。
dogmatic69提出的建议可能是一个更完整的解决方案。
感谢大家的建议和可能的解决方案。