2010-06-17 91 views
2

我寫BBcode轉換器到html。
轉換器應該跳過未封閉的標籤。正則表達式BBCode到HTML

我想到了2個選項做到這一點:
1)匹配一次使用一個正則表達式的呼叫,像所有標籤:

Regex re2 = new Regex(@"\[(\ /?(?:b|i|u|quote|strike))\]"); 
MatchCollection mc = re2.Matches(sourcestring); 

,然後遍歷MatchCollection使用2個指針找到啓動並打開標籤而不是用正確的html標籤替換。

2)調用正則表達式的多個時間爲每個變量和直接替代:

Regex re = new Regex(@"\[b\](.*?)\[\/b\]"); 
string s1 = re.Replace(sourcestring2,"<b>$1</b>"); 

什麼是更有效?

第一個選項使用一個正則表達式,但會要求我遍歷所有標記並找到所有對,並跳過沒有一對的標記。
另一個積極的方面是我不關心標籤之間的內容,我只是工作並用位置替換它們。

第二個選項我不需要擔心循環和特殊替換功能。
但將需要執行多個正則表達式和替換。

你能提出什麼建議?

如果第二個選項是正確的, 沒有與正則表達式 \[b\](.*?)\[\/b\]

如何解決它也匹配多線像一個問題:

[b] 
     test 1 
[/b] 

[b] 
     test 2 
[/b] 

回答

1
r = new System.Text.RegularExpressions.Regex(@"(?:\[b\])(?<name>(?>\[b\](?<DEPTH>)|\[/b\](?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:\[/b\])", System.Text.RegularExpressions.RegexOptions.Singleline); 

var s = r.Replace("asdfasdf[b]test[/b]asdfsadf", "<b>$1</b>"); 

那應該只給你具有匹配結束標籤的元素,並且也處理多行(即使我指定了SingleLine的選項,它實際上將它視爲單行)

它也應該正確處理[b] [b] [/ b],忽略第一個[b]。

至於這種方法是否比你的第一種方法更好,我不能說。但希望這會讓你指向正確的方向。

代碼與您的示例如下: System.Text.RegularExpressions.Regex r;

r = new System.Text.RegularExpressions.Regex(@"(?:\[b\])(?<name>(?>\[b\](?<DEPTH>)|\[/b\](?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:\[/b\])", System.Text.RegularExpressions.RegexOptions.Singleline); 

var s = r.Replace("[b]bla bla[/b]bla bla[b] " + "\r\n" + "bla bla [/b]", "<b>$1</b>"); 
+0

它不適用於字符串: 「[b] bla bla [/ b] bla bla [b]」+「\ r \ n」+「bla bla [/ b]」; – ilann 2010-06-17 19:28:02

+0

測試它與確切的代碼,它工作得很好,所以我不太確定問題可能是什麼。但如果你可以複製上面的代碼,並檢查:) 編輯:將代碼移動到我的答案 – Buildstarted 2010-06-17 19:56:17

2

一種選擇是使用更多的類似SAX的解析,而不是找你找[特定的正則表達式在那裏,然後讓你的程序處理,即使以某種方式,尋找],辦理甚至等等。儘管比正則表達式更冗長,但它可能更容易理解,並且不一定會更慢。