您好我正在研究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 }}
之类的东西永远不会发生。
答案 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';
“普通内容”部分与任何字符中的一个或多个匹配,除非下一个字符是{{
或}}
序列的开头。一旦我们开始匹配嵌入式标签,我们就会使用相同的技术来吞噬其内容。
答案 2 :(得分:-2)
正则表达式无法做到这一点。阅读数百万次使用正则表达式解析嵌套html / xml失败的尝试。