2014-02-10 49 views
1

我正在編寫PHP中的另一個模板引擎。應該Mustache.php真的是1.6MB ??我想要更輕,完全工作流不可知論者。包含供應商文件並使用它的良好日子發生了什麼?使用雙括號捕獲html標籤樣式語法的正則表達式

總之,語法很簡單,這樣我有一個非常簡單的工作的preg_replace簡單的變量即工作[變量]

但是我遇到的一個問題,而我想趕上封裝條件內容。即

[[#if this == 'that']] To be seen or not to be that is the question! [[/if]]

下面是我目前的正則表達式和它很接近,但我似乎無法制定出收盤[[/if]]標籤正確的規則;

它抓住過去的結束標記:(

preg_match('/\\[\\[#if(.+)\\]\\][^\\[\\]\\/](.+)\\[\\[\\/if\\]\\]/s', $template, $ifmatches);

任何幫助,將不勝感激

回答

1

This is my modification to your regex:

\[\[#(\w+)\s(.*?)\]\](.*?)\[\[\/\1\]\] 

,我所做的更改:

  • 我刪除了「if」的文字文本,而是將其與1到無限次之間的短文字符類\w進行匹配。我把它放到一個反向引用號爲1的捕獲組中。
  • 根據你的正則表達式,我在標籤名後面匹配一個空格,然後匹配任何字符,0和無限次之間,,可能(.*?)向引用數字2。
  • 標記之間的字符也與?量詞匹配如幾次儘可能並置於反向引用3.
  • 在結束標記,我使用的反向引用來捕獲組1,這樣標籤總是一致的。

確實使這項工作更好的事情是?量詞。它表達「懶惰」這是一件好事,因爲它不會「超出」。

這裏的演示是爲了說明它是如何工作的:

'?' Quantifier demonstration

+0

嗨瓦西里,不知道誰投你的答案了,但如果我能我會投上一票(不足夠的聲譽呢)。你的正則表達式完美無瑕,絕對更優雅!我的正則表達式令人窒息,請看[這裏](http://regex101.com/r/hD8jJ5)。我仍然不確定我錯了哪裏?但非常感謝你的幫助:)體育感謝您介紹我regex101.com ..驚人的實用程序。 – micahblu

+0

沒問題。由於它的工作原理,我會多寫一些關於我的正則表達式的工作原理。只要你願意,就立刻行動起來,接受答案,不要大驚小怪。大多數人都會回答任何與HTML或XML有關的問題,因爲一些狂熱分子認爲正則表達式不應該與它一起使用。 –

+0

順便說一句,表達式是否需要讓所有\字符按照你的問題逃脫兩次? –