2010-12-19 103 views
0

所以我有一些JavaScript將BBCode轉換爲HTML,這似乎工作正常,但我有一個問題。BBCode正則表達式解析問題

這裏是其中的一個表達式是工作,我用的BB標記轉換[B]和[/ B],以<b>和</B >。

str = str.replace(/\[b\]((\s|\S)*?)\[\/b\]/ig, '<b>$1</b>'); 

這也轉換連續標籤。例如

並[b] STR1 [/ B] [B] STR2 [/ B]

變得

STR1STR2

哪很好;這就是我想要的。然而,當我嘗試匹配,像這樣

str = str.replace(/\[quote\]((\s|\S)*?)\[\/quote\]/ig, '<span class="quotebox">$1</span>'); 

其中str是

[報價]巢1級[報價]巢2級了[/ quote] [/報價]

報價標籤

只有第一個標籤匹配和轉換,所以我將最終得到的輸出看起來像

鳥巢水平1 【引用】巢級別2

[/報價]

隨着報價框外最後一個引號標記 - 它應該被嵌套在其它一個內。幫幫我?

而且,如果是相關的,在quotebox類是如下

.quotebox {
邊界:1px的插圖黑色;
display:block;
margin-bottom:5px;
margin-top:5px;
padding:2px 2px 2px 4px;
}

+0

奇怪的問題;你爲什麼要用Javascript(客戶端)進行轉換,以及你在做什麼轉換? – 2010-12-19 02:01:34

+0

這就是爲什麼正則表達式*不能用於解析不規則語言的原因。 – 2010-12-19 02:05:28

+0

我通過Greasemonkey腳本將它用作另一個站點的「預覽器」。它與你提問時的stackoverflow功能類似。 – sam 2010-12-19 02:06:43

回答

1

你剛剛被通過的事實,(真正的)正則表達式只能描述regular languages咬傷。正則表達式無法描述的顯着特徵是遞歸。這個規範的例子是Dyck language,這個語言由所有的平衡括號的字符串組成,如(),(())()((())),((((()))))等。這是非規則的,基本上是你要解決的問題:匹配得當-snd [b][/b] s,[quote][/quote] s等。換句話說,用正則表達式來完成你想要的東西實際上是不可能的。但是,您可能已經注意到我說「真實」了。像JavaScript這樣的語言提供的正則表達式不是真正的正則表達式;他們有更多的權力,大部分(完全是?)源於反向引用。例如,正則表達式(.*)\1描述了一種非常規語言。儘管如此,我認爲你不能匹配Dyck語言。

那麼,有什麼解決方案?找到一個用JavaScript編寫的預先存在的BBCode to HTML轉換器!這絕對會讓你的生活變得最簡單。不幸的是,我並不知道其中的一個,因爲我沒有做很多JavaScript編程。 This StackOverflow question表示這樣的事情可能不存在,在這種情況下,唯一的選擇是推出自己的解析器。當然更復雜,但肯定可行。關閉我的頭頂(我不是專家),你可能想掃描字符串,直到找到標籤。 (認識到標籤對於正則表達式來說可能是一個很好的任務。)如果它是一個開始標籤,那麼將它推入堆棧。如果是結束標記,則彈出堆棧,確保結束標記與開始標記相匹配,並將迄今爲止看到的字符串包裝在適當的HTML中。這可能不起作用,或者它可能太複雜了 - 這只是我的快速思考問題後的2分鐘。


1:我不是100%肯定,但我見過匹配平衡括號中的正則表達式的唯一例子是Perl和它嵌入Perl代碼,它的JavaScript不能做。無論哪種方式,這是不明智的 - 你試圖使用一個工具,這將使你的任務更復雜。)