【问题标题】:Regular expression : Match anything but full token正则表达式:匹配除完整标记之外的任何内容
【发布时间】:2008-12-04 17:54:12
【问题描述】:

我有以下 sn-p,我想使用正则表达式在 {foreach}{/foreach} 之间提取代码:

{foreach (...)}
Some random HTML content <div class="">aklakdls</div> and some {$/r/template} markup inside.
{/foreach}

我已经有了:

{foreach [^}]*}

但在那之后我无法匹配任何东西。有什么办法可以匹配任何东西,但 {/foreach} 作为一个整体令牌?请注意,{foreach}{/foreach} 之间的内容也可以包含“{$”标记。

编辑:BaileyP 和 Tomalak 的答案是正确的,但为了简单起见,我选择了 BaileyP 的答案。

【问题讨论】:

    标签: php regex pcre


    【解决方案1】:

    我想出了这个

    /(?:{foreach .*?})(.*?)(?:{\/foreach})/gis
    

    RegExr测试

    【讨论】:

    • 是的。我现在觉得有点傻。 :-D 有时我觉得有点太复杂了,刚才正在输入同样的东西。 +1
    • 这当然不是万无一失的。嵌套的 foreach 循环会破坏它 - 但这是一个单独使用正则表达式无法解决的问题。
    • 您可以使用 Perl6 语法和 Perl 5.10 正则表达式进行嵌套的 foreach 循环。
    【解决方案2】:

    如果你的正则表达式不支持非贪婪匹配,下面会这样做,但既然这样我推荐@BaileyP's answer

    \{foreach [^}]*\}((?:.(?!\{/foreach\}))*[^{]?)
    

    根据您对正则表达式的偏好,负零宽度前瞻和非捕获组看起来有些不同。

    以下是组件:

    \{foreach [^}]*\} // 几乎不言自明 ( // 第一组比赛开始(这就是你要找的) (?: // 非捕获组开始 . // 任何事物... (?!\{/foreach\}) // ... 后面没有 "{/foreach}" )* // 非捕获组结束,尽可能多地重复 [^{]? // 匹配最后一个字符,除非是“{” ) // 第一组匹配结束,完成

    【讨论】:

    • 哇!你是正则表达式大师!它有效,但有一个问题, {/foreach} 之前的最后一个字符不匹配。你会怎么解决这个问题?
    • 你需要把点放在之后,而不是之前。
    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多