忽略嵌套标记的PHP正则表达式

忽略嵌套标记的PHP正则表达式,php,regex,Php,Regex,嗨,我正在处理CMS中的一个bug,我希望有人能帮我处理这个乱七八糟的正则表达式!我需要删除{{page?}}标记(其中“page”是一个动态单词)中的所有内容,包括其中任何嵌套的{{tags}}。-除了{{links?} 在下面的代码中,正则表达式应该删除{{homepage?}}标记中的所有内容: <div id="main"> <div id="left"> {{menu1}}<br /> {{homepage? <

嗨,我正在处理CMS中的一个bug,我希望有人能帮我处理这个乱七八糟的正则表达式!我需要删除{{page?}}标记(其中“page”是一个动态单词)中的所有内容,包括其中任何嵌套的{{tags}}。-除了{{links?}

在下面的代码中,正则表达式应该删除{{homepage?}}标记中的所有内容:

<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>
澄清:

没有
{{page?}
子标记(所有子标记都是
{{thisformat}}
)。
换句话说,类似于:
{{foo?{{{links?bar}}}}
的事情永远不会发生。

这在正则表达式中是不可能的。阅读有关使用regex解析嵌套html/xml的数百万次失败尝试的信息。

您可以执行以下操作:
如果我理解正确,这里就不需要递归匹配;
{{page?}
标记可能包含像
{{this}}
这样的简单标记,仅此而已。在这种情况下,您只需注意嵌套标记的开头,以便在它出现时匹配该标记的结尾,然后继续查找封闭的
{{page?}
标记的结尾或另一个嵌套标记的开头

$regex='#
  \{\{ (?!links\?) \w++\?     # page-tag start
  (?:
    (?: (?!\{\{|\}\}) . )++   # normal content
  |
    \{\{                      #
    (?: (?!\}\}) . )*+        # embedded tag
    \}\}                      #
  )*+
  \}\}                        # page-tag end
#sx';
“正常内容”部分与任何字符中的一个或多个匹配,除非下一个字符是
{{
}
序列的开头。一旦我们开始匹配一个嵌入的标签,我们就使用同样的技术来吞噬它的内容


什么
{{{page?}
标签?你是说
{{homepage?..}}
?是否确实要删除除“链接”标记之外的所有标记?
{{foo?{{links?bar}}}baz}}
会发生什么?或者您只是想获取links标记的内容吗?使用
(?R)
语法的递归正则表达式可能就足够简单了。在您的情况下,您可能会侥幸逃脱:
“{{(?!links)\w+\((?R)}.*}}}s”
-但是
应该重写为更具体的内容。抱歉@Qtax by
{page?}
我的意思是页面是动态的(可以是任何单个单词,如主页、链接、联系人等)。没有{page?}}子标记(所有子标记都是{{thisformat}}),因此您的示例永远不会出现@马里奥-看起来很有前途。我会给它一个爆炸和报告回来。他不是解析*ML-tho,匹配递归结构很容易,但可能最好写一个解析器。:)使用正则表达式解析XML的问题是嵌套。不要让标题迷惑你-实际上这个问题中只有一个嵌套级别,使语言规则化。知道这一点会有帮助:)它太完美了!谢谢你!
$regex='#
  \{\{ (?!links\?) \w++\?     # page-tag start
  (?:
    (?: (?!\{\{|\}\}) . )++   # normal content
  |
    \{\{                      #
    (?: (?!\}\}) . )*+        # embedded tag
    \}\}                      #
  )*+
  \}\}                        # page-tag end
#sx';