2008-12-04 97 views
1

我有下面的代碼片段,我想使用正則表達式來提取{foreach}{/foreach}之間的代碼:正則表達式匹配任何條件,但完全令牌

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

我已經有了:

{foreach [^}]*} 

但之後我無法匹配任何東西。有什麼方法可以匹配任何東西但{/ foreach}作爲一個整體標記?請注意,{foreach} {/ foreach}之間的內容也可以包含「{$」令牌。

編輯:BaileyP's & Tomalak的回答是正確的,但我爲了簡單起見選擇了BaileyP的回答。

回答

5

我想出了這個

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

測試與RegExr

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 
+0

哇!你是正則表達式的主人!它有效,但有一個問題,即{/ foreach}之前的最後一個字符不匹配。你會如何解決這個問題? – Vincent 2008-12-04 18:17:26

+0

杜。當然。等一下。 – Tomalak 2008-12-04 18:19:18