看過(guò)許多UBB代碼,包括JS,ASP,JSP的,一直沒發(fā)現(xiàn)表格的UBB,雖然可以直接用HTML模式實(shí)現(xiàn)相同表格功能,但對(duì)于某些開放的站點(diǎn)來(lái)說(shuō)開放HTML模式終究是不合適的,故一直想實(shí)現(xiàn)表格的UBB。
我的設(shè)想是在HTML編輯器(HTML,F(xiàn)RONTPAGE,DW)中作好表格,把<替換為[,>替換為],直接復(fù)制HTML并提交發(fā)布。
可惜經(jīng)過(guò)實(shí)踐,發(fā)現(xiàn)很難。因?yàn)楸砀竦腍TML標(biāo)記和其他元素的HTML標(biāo)記差別很明顯,主要原因TD,TR,特別是TABLE都能嵌套。其實(shí)我遇到的關(guān)鍵問(wèn)題在于我不會(huì)寫 不包含某個(gè)單詞或語(yǔ)句(非單字符)的正則 ,譬如下面標(biāo)記
QUOTE:
[TABLE][TR] [TD]哈哈[TABLE][TR][TD]的[/TD][/TR][/TABLE][/TD][/TR][/TABLE]
你要匹配正確[TD]*[/TD]你就得必須保證*不包括[TABLE][TR][TD]等,注意不能用[^[]*?啊,因?yàn)橛盟麩o(wú)法匹配正確的[/TD]的,所以問(wèn)題在與我怎么保證這個(gè)*不包括[TABLE][TR][TD]呢,(我不會(huì)寫)。所以我:
退一步,先用[td[^]]*?][^[]*?[table找到最后一個(gè)(其實(shí)最內(nèi)層的)表格,然后把最內(nèi)層的表格轉(zhuǎn)為HTML標(biāo)記,然后循環(huán)從頭開始再來(lái)一次,一直到所有標(biāo)記被替換。這個(gè)理論上是可以實(shí)現(xiàn)的。我用JSP正在實(shí)驗(yàn),需要時(shí)間,希望有興趣朋友用ASP,PHP實(shí)驗(yàn)一下。
因?yàn)槲壹庇茫晕矣滞肆艘徊?,就是直接查找][TABLE]等標(biāo)記然后替換,有4個(gè)表達(dá)式,[TABLE][TR][TD]、[/TD][/TR][TR][TD]、[/TD][TD]、[/TD][/TR][TABLE] ,大家知道,UBB需要把/R/N替換成<BR>的,于是我用上面作出的正則查找并替換掉所有[TABLE]和[TR]和[TD]和[/TD]和[/TR]和[/TABLE]中的換行。其實(shí)這個(gè)表達(dá)式比下面表達(dá)式就多了這個(gè)替換換行功能,其不足之處是很明顯的,就是不能完善的剔除非配套的標(biāo)記,必須保證所有TABLE標(biāo)記是正確配套的(有TBODY的再改改就是了),否則亂套???nbsp;這一步我實(shí)踐還不錯(cuò)。
再退一步,其實(shí)沒法退了,就是直接單個(gè)查找替換[TABLE]等標(biāo)記,這是最苯的方法了,也是效果最不好的,因?yàn)榇蠹抑涝贖TML編輯器里的表格標(biāo)記中好多換行的,而UBB是為換行轉(zhuǎn)為<BR>的,所以這個(gè)方法實(shí)現(xiàn)了會(huì)發(fā)現(xiàn)好多空行的,而且這個(gè)方法和上面那一步一個(gè)共同缺點(diǎn)就是更不能剔除非配套標(biāo)記。
附我寫的退一步后的正則:(我用JSP)
QUOTE:
\[(table)([^\[]*?)\][^\[]*?\[tr\][^\[]*?\[td([^\[]*)\]|\[\/(td)\][^\[]*?\[\/tr\][^\[]*?\[tr\][^\[]*?\[td([^\[]*)\]|\[\/(td)\][^\[]*?\[td([^\[]*)\]|\[\/(td)\][^\[]*?\[\/tr\][^\[]*?\[\/table\]
我想如果是管理員發(fā)布信息什么的,能保證表格標(biāo)記的正確的話用這個(gè)還可以的。其實(shí)如果有人想搗亂的話,再嚴(yán)謹(jǐn)?shù)腢BB也不能防止的啊。
歡迎有興趣者來(lái)此討論,提出更好建議,打造最好最全的UBB。