2011-07-21 55 views
0

我需要一個PHP模板解析器能夠解析以下格式:PHP嵌套模板解析器

{users} 
    {name} 
    {age} 
    {posts} 
     {title} 
     {body} 
     {comments} 
      {comtitle} 
      {combody} 
     {/comments} 
    {/posts} 
{/users} 

所有模板解析器我看着......要麼不夠遞歸或配備不必要的模板與PHP語法看起來非常相似的構造,這是不值得的。這是CodeIgniter模板的默認工作方式,但它們不夠深入。

信不信由你,沒有this blog post中的解析器似乎能夠做到這一點。有些人可以實現它,但是有一個接近PHP本地foreach函數的語法。

你知道解析器是否存在嗎? 還是你創建了一個讀取這種類型的結構? 只要給它提供了更多的嵌套數組,它所需的解析器應該能夠無限進一步挖掘。

具體來說,我在尋找一個CodeIgniter解決方案,但是現在任何PHP解決方案都已經足夠了,因爲我已經調查了幾天了。

謝謝!

+0

華友世紀,他們改造XML與不同標籤的分隔符!我會說XSLT,甚至可能會派上用場瞭解它的未來工作。 – Wrikken

回答

0

我決定完全放棄第三方模板解析器,並選擇使用PHP的本機支持。與兼容性,深嵌套,條件,循環相關的頭痛,都在我自己的規範中,不值得。從現在開始,我將簡要介紹我的設計器循環和條件語句,以便處理複雜的視圖。對於使用CodeIgniter的人,我強烈建議啓用短標記和呼應了數據獲取的CodeIgniter's Optional Syntax優勢:

相反的:<?php echo $variable; ?>

一個可以這樣寫:<?=$variable?>

看看如何接近這個接近標準模板語言:{variable}

開始使用PHP的Alternative Syntax For Control Structures,以便您的代碼不會被echo語句和長的PHP PHP字符串散佈。

IMO這是模板解決方案。雖然你的設計師會恨你介紹:

ifelseifendifforeachendforeach,跟他們解釋,他們用的例子會給你在你的觀點了最大的靈活性是如何工作的一個小時的討論。

瘋了!

1

正如所寫,該格式看起來不可能解析。無法區分將匹配{/tag}(如{posts})的{tag}和不會(如{body})的匹配。

不要試圖重新發明輪子。有很多很好的模板解析器,以及PHP本身。除非你真的很好,否則你提出的任何東西可能都不會像已經存在的東西那麼有效,也不會那麼快。

+0

重塑車輪正是我不想做的 - 這就是爲什麼我問這個問題。你能解釋「沒有辦法區分{tag} ...嗎?」嗎?我以前沒有寫過解析器,但將{tag} {/ tag}與單個{tag}區分開來似乎很平凡......您首先閱讀整個模板,如果它具有匹配的{/ tag},則意味着循環遍歷相應數組的所有元素,否則,期望{tag}是單個元素,否? –

+0

不得不在解析器中展望這樣的效率會非常低下。 – duskwuff

+0

你是完全正確的。不知怎的,我重新登陸這個問題 - 兩年前我非常天真/缺乏經驗。這是一直以來的偉大建議。乾杯! –

0

「我沒有測試來支持這個,但我會認爲這是一個計算機的笑話。」 @Jordan Arseno

約旦,我同意。雖然如果你有很多文件需要同時解析,它可能會加起來非常糟糕。我同意你有自己的模板解析器,如果你有驅動器/特殊需求的話。雖然使用一點點不同的語法可以爲您節省大量的處理時間在分析過程中...

而不是使用這個版本:

{users} 
    {name} 
    {age} 
    {posts} 
     {title} 
     {body} 
     {comments} 
      {comtitle} 
      {combody} 
     {/comments} 
    {/posts} 
{/users} 

你也可以同樣使用類似:

{foreach: users} 
    {name} 
    {age} 
    {foreach: posts} 
     {title} 
     {body} 
     {foreach: comments} 
      {comtitle} 
      {combody} 
     {endforeach: comments} 
    {endforeach: posts} 
{endforeach: users} 

通過這種方式,當找到{foreach:<array>}模式時,您會知道有一個匹配標籤,您不必嘗試爲所有模式找到一個標籤。然後您就可以輕鬆使用preg_match()來完成任務。

(注:你仍然可以做你的風格一樣,雖然你將不得不向後分析代碼,這將使它確實不方便我猜)