大家好,
我需要优化一个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}需要有两个不同的匹配。第一个匹配将只有group 1。第二个匹配将有group 1和group 3。
如果有人需要更多信息,请不要犹豫,尽管问。内容管理系统是使用CakePHP框架在PHP中构建的。
向任何能帮助我的人致以巨大的赞誉:D!
发布于 2010-10-10 20:38:23
我已经想出了一个解决方案,目前效果非常好。我先检查并获取所有成对的标签,然后再获取单个标签。然后,我使用PHP对其他标记内容中的标记进行递归处理。
dogmatic69提出的建议可能是一个更完整的解决方案。
感谢您的建议和可能的解决方案。
发布于 2010-10-08 11:51:14
您的语法对于正则表达式来说太复杂了。你需要一个上下文无关的语法。(请在Chomsky hierarchy上阅读以了解原因。)
我建议使用现有的模板语言(如Smarty),而不是自己发明。
https://stackoverflow.com/questions/3887548
复制相似问题