2017-03-09 41 views
0

我正在使用C#編寫HTML模板引擎。除了使用基本的字符串操作(查找/替換)而不是完整的編譯器外,我想實現與Handlebars.Net(Handlebars.js的C#實現)等庫類似的功能。在自定義HTML結構中查找開始和結束標記

語法將一些諸如:

{{#each item in items}} 

    <li>{{item.Name}}</li> 

{{/each}} 

我希望做簡單的字符串替換使用正則表達式,但我知道正則表達式將在這方面有不足之處,比如在本例中發現的結束標記下面(它會找到第一個嵌入{{/每}}而不是最後分析的第一個標籤時):

{{#each item in items}} //while parsing this tag... 

    <p>{{item.Name}}'s Hobbies:</p> 

    <ul> 
    {{#each hobby in item}} 

     <li>{{hobby.Name}}</li> 

    {{/each}} //this end tag would be found first 
    </ul> 

{{/each}} //rather than this one 

我需要找到任何給定的「標記」(如開頭和結尾{ {#each}} ... {{/ each}}),並創建一個類似DOM的結構來解析每個標籤的內容。 「DOM」可以嵌入多個標籤(認爲嵌入的foreach循環x4)。什麼是實現這一目標的好方法?

+1

你應該嘗試以幾種不同的方式實現它 - 這就是你如何學習,你可以做到!當你遇到某些特定的事情時***回來並尋求幫助。 – caesay

+1

要真正做到「正確」,你需要做輕鬆/解析,幾乎你說你不想做的事情。要做到這一點「快速」搜索你的字符串罰款每個{{#each}}和讀取{{/每個}}。這個函數然後是遞歸的,所以它支持嵌套條目。如果有很多不同的標籤,你需要處理所有這些。編寫這樣一個解析器是一項艱鉅的任務,如果你想展示你所嘗試過的東西,我會很樂意提供幫助,但這是一項非常重要的任務,我懷疑你會找到一個能夠做到這一點的人你在這裏。 SO是爲了幫助,而不是編碼器4免費。 – dman2306

+0

'好'的方法是編寫一個分析器,它知道狀態和嵌套元素等 - 而不是正則表達式字符串替換。爲什麼你不想編寫一個解析器(我認爲你的意思是'全面編譯器')? – Tim

回答

0

在我看來,解析非常功能看事情:正則表達式一些字符<>,解析爲標籤,重複字符,正則表達式的下一個<>,獲得其間的內容標籤,隱蔽串...等。等等等等。

在我看來,這種功能性的,每次添加字符的解析方法都是要求文本編輯器執行標籤識別,語法高亮等任務的副產品。大多數簡單地說,文本編輯器的「目的」是希望一個「模型」對象成爲一個充滿unicode字符的面板,它可能是非常無知的,並且我們已經習慣於迫使它在對象模型中「變得聰明」 。

我一直在設計我自己的版本,在Monarch編輯器裏面(這可能是我們在2017和2年可以做的最好的)中「傷害我很多」HTML標籤之後進行的。愚蠢複雜。)

我接近它的方式不是作爲文本編輯器,而是作爲MVC意義上的一個視圖,它表面上是一個文本編輯表面,但實際上是一個模板化的,有序的模型,它對用戶行爲。

+0

在您的版本中查找塊(包含中間內容的開始和結束標籤)的方法是什麼? –

+0

我沒有找到標籤或內容,我得到一個模型對象,例如'var nodes = context.Where(n => n.ElementText =「h1」)。ToList ();' – NWoodsman