正则表达式:匹配除完整令牌之外的任

时间:2008-12-04 17:54:12

标签: php regex pcre

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

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

我已经拥有:

{foreach [^}]*}

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

修改:BaileyP&amp; Tomalak的答案是正确的,但为了简单起见,我选择了BaileyP的答案。

2 个答案:

答案 0 :(得分:5)

我想出了这个

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

使用RegExr

进行测试

答案 1 :(得分:2)

如果你的正则表达式味道不支持非贪婪的匹配,下面会这样做,但是因为它确实如此,我推荐@BaileyP's answer

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

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

以下是组件:

\{foreach [^}]*\}  // pretty much self-explanatory
(                  // match group one starts (that's what you are looking for)
 (?:               // non-capturing group starts
  .                // anything...
  (?!\{/foreach\}) // ... that is not followed by "{/foreach}"
 )*                // non-capturing group ends, repeat as often as possible
 [^{]?             // match the last character, unless it is "{"
)                  // match group one ends, done