PHP正则表达式忽略嵌套标签

时间:2011-05-18 14:28:10

标签: php regex

您好我正在研究CMS中的一个错误,我希望有人可以帮我解决这个混乱的正则表达式!我需要删除{{page?标签(其中'page'是动态字),包括其中的任何嵌套{{tags}} .- {{links? }}

在下面的代码中,正则表达式应删除{{主页?标签:

<div id="main">   
    <div id="left">
    {{menu1}}<br />

{{homepage?
    <img src="images/{{timenow}}.gif" width="177" height="217" alt="{{imgname}}" id="biglogo" />
}}

{{links?
    <b>LINKS</b>
}}
</div>
{{menu2}}
</div>

这是我到目前为止所拥有的。它一看到timenow}}

就会卡住
$result=preg_replace("#\{\{(?!links)\S*?\?.*?}}#s","",$result);

澄清:

没有{{page? }}个子标记(所有子标记都是{{thisformat}})。 换句话说,{{foo? {{links? bar }} baz }}之类的东西永远不会发生。

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作: #\{\{ (?!links\b) \w+ \? (?: \{\{\w+}} | [^{}]+ | \{(?!\{) | }(?!}) )* }}#sx

答案 1 :(得分:2)

如果我理解正确,这里不需要递归匹配; {{page? }}标记可能包含{{this}}之类的简单标记,就是这样。在这种情况下,您只需要注意嵌套标记的开头,这样您就可以在标记显示时匹配该标记的结尾,然后继续寻找封闭的{{page? }}标记的末尾或另一个嵌套标签的开头。

$regex='#
  \{\{ (?!links\?) \w++\?     # page-tag start
  (?:
    (?: (?!\{\{|\}\}) . )++   # normal content
  |
    \{\{                      #
    (?: (?!\}\}) . )*+        # embedded tag
    \}\}                      #
  )*+
  \}\}                        # page-tag end
#sx';

“普通内容”部分与任何字符中的一个或多个匹配,除非下一个字符是{{}}序列的开头。一旦我们开始匹配嵌入式标签,我们就会使用相同的技术来吞噬其内容。

<强> see it in action at ideone.com

答案 2 :(得分:-2)

正则表达式无法做到这一点。阅读数百万次使用正则表达式解析嵌套html / xml失败的尝试。