我想我需要一些正則表達式幫助。我想查找像<?abc?>
這樣的所有標籤,以便我可以用代碼運行的結果替換它。我只需要幫助重新編碼標記/代碼字符串,而不是解析裏面的代碼:p。在html文檔中查找/解析服務器端<?abc?> -like標籤
<b><?abc print 'test' ?></b>
會導致<b>test</b>
編輯:不明確,但一般來講,匹配(<?[chars] (code group) ?>)
我想我需要一些正則表達式幫助。我想查找像<?abc?>
這樣的所有標籤,以便我可以用代碼運行的結果替換它。我只需要幫助重新編碼標記/代碼字符串,而不是解析裏面的代碼:p。在html文檔中查找/解析服務器端<?abc?> -like標籤
<b><?abc print 'test' ?></b>
會導致<b>test</b>
編輯:不明確,但一般來講,匹配(<?[chars] (code group) ?>)
這將建立字符串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?>
我還沒有能夠測試這些代碼,所以一些函數可能有點錯誤,或者可能會有一些錯誤。
我通常不會主張使用'。*?',但是所有可以想到的'所有與這一系列角色'相匹配的替代方案都過於複雜,亂。 – ICR 2010-12-21 12:15:17
*我想要一切!但很少有!*嘿嘿 – 2010-12-21 18:44:09
如果我只是做了代碼組的輸出,它似乎'<?abc echo'?>'; ?>'echo in'echo''; ?>'。你也錯過了第二到最後一行paren。這是一個好的開始,但我認爲我已經足夠了解這個錯誤。 – Iggyhopper 2010-12-21 20:03:30
exp = new Regex(@"<\?abc print'(.+)' \?>");
str = exp.Replace(str, "$1")
像這樣的東西應該做的伎倆。更改正則表達式如何您認爲合適
var new Regex(@"<\?(\w+) (\w+) (.+?)\?>")
這將以此爲源
<b><?abc print 'test' ?></b>
,並打破它,就像這樣:
Value: <?abc print 'test' ?>
SubMatch: abc
SubMatch: print
SubMatch: 'test'
這些就被髮送到處理它的方法不同,這取決於什麼零件是。
如果你需要更高級的語法處理,你需要超越正則表達式我相信。
我設計使用Antlr模板引擎,但多數民衆贊成的方式更加複雜;)
你的意思是,它總是有一個打印「東西」,你會想更換整個用'東西'? –
2010-12-21 07:20:40
我不是C#專家,但概念應該像這樣工作。使用某種搜索/查找功能查找<?abc print'。然後,存儲該位置。從那裏,找到下一個'發生了什麼(爲了逃避,找到下一個'沒有\'的字符在它之前[\'=轉義])。或者找到'?>。從那裏,從位置和位置2之間的長度開始,使用第一個位置的子串函數,結果將成爲「print」'「標記中的結果。 – RageD 2010-12-21 07:22:55
我想要我自己的類型的標籤,我可以找到並將代碼內容分組到。 '(<?php(code group)?>)' – Iggyhopper 2010-12-21 07:28:32