2010-10-08 55 views
0

問候全部,需要爲模板解析器優化正則表達式

我需要優化正在使用的RegEx來解析CMS中的模板標記。標籤可以是單個標籤,也可以是匹配的一對。一些標籤的例子:

{static:input:title type="input"} 

{static:image:picture}<img src="{$img.src}" width="{$img.width}" height="{$img.height"} />{/static:image:picture} 

這裏是正則表達式我目前有正確的選擇我需要什麼,但我跑它通過使用RegexBuddy調試器,它需要的步驟幾萬做一個匹配,如果HTML頁面是相當大的。

{static([\w:]*)?\s?(.*?)}(?!"|')(?:((?:(?!{static\1).)*?){/static\1})? 

當這個匹配一個標籤,組1是參數是所有冒號分開的單詞。組2是參數。第3組(如果它是一個標籤對)是每個標籤之間的內容。

當我將這些標籤粘貼到我的條件標籤中時,我也遇到了問題。像這樣的東西不符合正常2組(第2組應該是空白,既匹配下面標籤):

{if "{static:image:image1}"!=""} 
    <a href="{static:image:image1}" rel="example_group" title="Image 1"></a></li> 
{/if} 

需要的工作是有相同的標籤在一排,但被使用了兩次另一種情況第一個實例使用單個標籤,第二個實例用作標籤對。所以像這樣:

{static:image:picture} 
{static:image:picture}<img src="{$img.src}" width="{$img.width}" height="{$img.height"} />{/static:image:picture} 

需要有兩個單獨的匹配。第一場比賽將只有第一組。第二場比賽將有第1組和第3組。

如果有人需要更多的信息,請不要猶豫,問。 CMS使用CakePHP框架構建在PHP中。

對任何能夠幫助我的人都很感謝:D!

+0

使用Smarty(http://smarty.net/) – Cfreak 2010-10-08 03:44:47

+0

我不打算使用Smarty。我希望這與我的CMS緊密結合。我不需要Smarty擁有的所有「特徵」。 – 2010-10-08 03:48:40

+0

使用小鬍子http://github.com/bobthecow/mustache.php你試圖通過外觀來做到這一點http://github.com/bobthecow/mustache.php/blob/master/examples/dot_notation/dot_notation .mustache – dogmatic69 2010-10-08 16:27:32

回答

0

我想出了一個現在可以很好地工作的解決方案。我正在通過抓取所有配對標籤,然後抓取單個標籤。然後,我使用PHP來執行標籤在其他標籤內容中的遞歸方面。

dogmatic69提出的建議可能是一個更完整的解決方案。

謝謝大家的建議和可能的解決方案。

1

您的語法對於正則表達式來說過於複雜。你需要一個上下文無關語法。 (請閱讀Chomsky hierarchy以瞭解原因。)

我第二次推薦使用現有模板語言(如Smarty),而不是自己創建模板語言。

+0

問候Zack,謝謝你的回覆。我很抱歉,但我沒有心理上的能力去追蹤你發佈的那篇文章上寫的任何內容。至於我的語法,對我來說似乎很簡單。我有RegEx工作,它只需要一些微調。 至於使用另一種模板語言,我不打算這樣做。我還沒有找到我喜歡的一個,也不會很適合我的CMS工作方式。我寫的一篇作品只是需要一些微調。 – 2010-10-08 03:55:57

+0

我嘗試總結一下:你展示了幾個例子,它們將標籤嵌套在其他標籤的參數或內容中。對於正則表達式來說,處理涉及嵌套的語法在數學上是不可能的。你可能能夠從事玩具的例子,但你無法處理一般情況。上下文無關的解析器是這項工作的正確工具。它也會讓你的表演問題也消失。 http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns討論你面臨的問題少數學。 – zwol 2010-10-08 04:05:46

+0

我看到你在做什麼但不是,我的模板引擎不需要像你想象的那樣遞歸。這些標籤不允許在彼此之內。唯一的嵌套是我的條件解析器,這些工作正常。所以你不能像這樣:{static:input:foo param =「{static:input:bar}」}。 – 2010-10-08 04:12:47