1

我有以下代码片段,我想在其中提取{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 的答案。

4

2 回答 2

5

我想出了这个

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

RegExr测试

于 2008-12-04T18:21:49.673 回答
2

如果您的正则表达式风格不支持非贪婪匹配,则可以使用以下方法,但既然这样做了,我推荐@BaileyP's answer

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

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

以下是组件:

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