2010-12-21 31 views
1

我想我需要一些正則表達式幫助。我想查找像<?abc?>這樣的所有標籤,以便我可以用代碼運行的結果替換它。我只需要幫助重新編碼標記/代碼字符串,而不是解析裏面的代碼:p。在html文檔中查找/解析服務器端<?abc?> -like標籤

<b><?abc print 'test' ?></b>會導致<b>test</b>

編輯:不明確,但一般來講,匹配(<?[chars] (code group) ?>)

+0

你的意思是,它總是有一個打印「東西」,你會想更換整個用'東西'? – 2010-12-21 07:20:40

+0

我不是C#專家,但概念應該像這樣工作。使用某種搜索/查找功能查找<?abc print'。然後,存儲該位置。從那裏,找到下一個'發生了什麼(爲了逃避,找到下一個'沒有\'的字符在它之前[\'=轉義])。或者找到'?>。從那裏,從位置和位置2之間的長度開始,使用第一個位置的子串函數,結果將成爲「print」'「標記中的結果。 – RageD 2010-12-21 07:22:55

+0

我想要我自己的類型的標籤,我可以找到並將代碼內容分組到。 '(<?php(code group)?>)' – Iggyhopper 2010-12-21 07:28:32

回答

2

這將建立字符串source的新副本,用process(code)

Regex abcTagRegex = new Regex(@"\<\?abc(?<code>.*?)\?>"); 

StringBuilder newSource = new StringBuilder(); 
int curPos = 0; 

foreach (Match abcTagMatch in abcTagRegex.Matches(source)) { 
    string code = abcTagMatch.Groups["code"].Value; 
    string result = process(code); 

    newSource.Append(source.Substring(curPos, abcTagMatch.Index)); 
    newSource.Append(result); 
    curPos = abcTagMatch.Index + abcTagMatch.Length; 
} 

newSource.Append(source.Substring(curPos)); 
source = newSource.ToString(); 

注:結果替換<?abc code?>我還沒有能夠測試這些代碼,所以一些函數可能有點錯誤,或者可能會有一些錯誤。

+1

我通常不會主張使用'。*?',但是所有可以想到的'所有與這一系列角色'相匹配的替代方案都過於複雜,亂。 – ICR 2010-12-21 12:15:17

+0

*我想要一切!但很少有!*嘿嘿 – 2010-12-21 18:44:09

+0

如果我只是做了代碼組的輸出,它似乎'<?abc echo'?>'; ?>'echo in'echo''; ?>'。你也錯過了第二到最後一行paren。這是一個好的開始,但我認爲我已經足夠了解這個錯誤。 – Iggyhopper 2010-12-21 20:03:30

0
exp = new Regex(@"<\?abc print'(.+)' \?>"); 
str = exp.Replace(str, "$1") 

像這樣的東西應該做的伎倆。更改正則表達式如何您認爲合適

1
var new Regex(@"<\?(\w+) (\w+) (.+?)\?>") 

這將以此爲源

<b><?abc print 'test' ?></b> 

,並打破它,就像這樣:

Value: <?abc print 'test' ?> 

    SubMatch: abc 
    SubMatch: print 
    SubMatch: 'test' 

這些就被髮送到處理它的方法不同,這取決於什麼零件是。

如果你需要更高級的語法處理,你需要超越正則表達式我相信。

我設計使用Antlr模板引擎,但多數民衆贊成的方式更加複雜;)