2010-08-05 52 views
0

你好,我希望能夠像解析和緩存更高性能的元語言一樣。所以我需要能夠將元代碼解析爲對象或數組。使用preg_match解析PHP中的嵌套結構

Startidentifier:{

Endidentifier:}

您可以通過以點對象導航,但你也可以做算術/邏輯/關係運算()。

這裏是什麼樣的元語言看起來像一個例子:

  • {} mySelf.mother.job.jobName

或嵌套

  • {{自己MyObj中。{keys [「ObjProps」] [0]}。personAttribute.first} .size}

個或與操作

  • {obj.val *(otherObj.intVal + myObj.longVal)== 1200}

或多個邏輯

  • {obj.condition ==! myObj.otherCondition}

我想你們大部分人已經明白我想要什麼了。目前我只能做簡單的操作(沒有嵌套並且只有2個值),但是用動態屬性名稱獲取值的嵌套工作正常。文本concatination工作正常

例如, 「你好{myObj.name}!你好嗎{myObj.type}?」。

如果像(條件)一樣也可以做出短的? (true-case):(false-case)會很好,但我不知道如何解析所有這些東西。我目前正在使用一些正則表達式的循環,但如果我有更多的正則表達式,它可能會更快,更可維護。

所以任何人都可以給我一些提示或想幫助我嗎?也許訪問項目網站了解我需要什麼:http://sourceforge.net/projects/blazeframework/

在此先感謝!

+0

如果你需要正則表達式的幫助,請給出幾個「之前」和「之後」的例子,以確定你想要的轉換類型。 (或者匹配[你想要提取的內容],如在這種情況下) – zebediah49 2010-08-05 21:48:03

+0

你可能會更好地編寫一個解析器,只是消耗字符串將它們映射到某些預定義的標記,並相應地採取行動。足夠的例子在互聯網上'寫你自己的解析器'。 – Wrikken 2010-08-05 21:55:39

+1

你應該改變你的目錄結構。如果我在十分鐘內甚至找不到解析器的代碼,它肯定會很糟糕。 – NikiC 2010-08-05 22:00:42

回答

1

使用正則表達式解析不確定數量的匹配花括號是不平凡的,因爲一般來說,要麼你會匹配太多或者太少。

例如,考慮Hello {myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}?使用兩個例子從您的輸入相同的字符串:

如果使用可能想到\{.*\}匹配括號中的第一個正則表達式,你會得到一個匹配:{myObj.name}! {mySelf.{myObj.{keys["ObjProps"][0]}.personAttribute.first}.size}這是因爲默認情況下,正則表達式是貪婪並將儘可能匹配。

從那裏,我們可以嘗試使用非貪婪模式\{.*?\},它將盡可能少地匹配打開和關閉大括號。使用相同的字符串,此模式將產生兩個匹配項:{myObj.name}{mySelf.{myObj.{keys["ObjProps"][0]}。很明顯,第二個不是完整的表達式,但是非貪婪的模式將盡可能少地匹配,並且這是滿足模式的最小匹配。

PCRE的確允許recursive regular expressions,但如果沿着這條路線走下去的話,最終會形成一個非常複雜的模式。

在我看來,最好的解決方案是構造一個標記器(可以使用正則表達式)來將你的文本轉換爲一個可以被解析的標記數組。

+1

非常感謝!我現在用基於正則表達式的分詞器來實現它,它使用遞歸來檢測括號。這種模式不是很複雜的方式,但我必須遞歸調用方法來獲得所有的孩子,但它很快,很好= D – 2010-09-05 11:09:41

0

也許看看PREG_OFFSET_CAPTURE標誌!?