【问题标题】:PHP Regex ignoring nested tagsPHP正则表达式忽略嵌套标签
【发布时间】:2011-05-18 14:28:10
【问题描述】:

您好,我正在处理 CMS 中的一个错误,我希望有人可以帮我解决这个混乱的正则表达式!我需要删除 {{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>

这是我目前所拥有的。一看到timenow}}就卡住了

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

澄清:

没有 {{page? }} 子标签(所有子标签都是 {{thisformat}} )。 换句话说:{{foo? {{links? bar }} baz }} 永远不会发生。

【问题讨论】:

  • 什么{{page? }}标签?你是说{{homepage? ... }}?您真的要删除除链接标签之外的所有标签吗? {{foo? {{links? bar }} baz }} 会发生什么?或者你只是想获取链接标签的内容?
  • 这可能很简单,使用(?R) 语法的递归正则表达式。在您的情况下,您可能会逃脱:"#\{\{(?!links)\w+\?((?R)|.)*}}#s" - 但应该将. 重写为更具体的内容。
  • Sorry @Qtax by {{page? }} 我的意思是页面是动态的(可以是主页、链接、联系人等任何单个单词)。没有{{页面? }} 子标签(所有子标签都是 {{thisformat}} )所以你的例子永远不会出现。 @mario - 看起来很有希望。我会全力以赴并报告。

标签: php regex


【解决方案1】:

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

【讨论】:

  • 完美!谢谢!
【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 他没有解析 *ML tho,匹配递归结构很容易,但编写解析器可能更好。 :)
    • 用正则表达式解析XML的问题是嵌套。
    • 不要让标题迷惑你——这个问题实际上只有一层嵌套,使语言变得规则。
    • 知道这会有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多