簡體   English   中英

BBCode的JavaScript RegExp幫助

[英]JavaScript RegExp help for BBCode

我有幾個星期前發現的這個RegExp表達式

/([\r\n])|(?:\[([a-z\*]{1,16})(?:=([^\x00-\x1F"'\(\)<>\[\]]{1,256}))?\])|(?:\[\/([a-z]{1,16})\])/ig

它正在努力尋找BBCode標簽,如[url][code]

但是,如果我嘗試[url="http://www.google.com"] ,則無法匹配。 我不是很擅長RegExp而且我無法弄清楚如何仍然有效,但="http://www.google.com"是可選的。

對於[color="red"]這也是失敗的,但是這與url標簽所具有的問題相同。

這部分: [^\\x00-\\x1F"'\\(\\)<>\\[\\]]表示在=之后一定不能有”。 這意味着你的正則表達式匹配[url=http://stackoverflow.com] 如果你想有引號,你可以簡單地將它們放在捕獲組周圍:

/([\r\n])|(?:\[([a-z\*]{1,16})(?:="([^\x00-\x1F"'\(\)<>\[\]]{1,256})")?\])|(?:\[\/([a-z]{1,16})\])/gi

我認為您可以從顯式枚舉您想要匹配的所有標記中受益,因為它應該允許更具體地匹配結束標記。

這是一個示例代碼

var tags = [ 'url', 'code', 'b' ]; // add more tags

var regParts = tags.map(function (tag) {
    return '(\\[' + tag + '(?:="[^"]*")?\\](?=.*?\\[\\/' + tag + '\\]))';
});

var re = new RegExp(regParts.join('|'), 'g');

您可能會注意到正則表達式由一組較小的表達式組成,每個較小的一個表示具有可變長度的可能屬性的單個標記( (?:="[^"]*")? ,見下面的解釋),如[url="google.com"] ,並用交替運算符|分隔。

(="[^"]*")?表示=符號,然后是雙引號,后跟任何數量的雙引號( [^"]以外的任何符號,即0或更多,( * ),后跟收尾報價。 決賽? 意味着整個群體可能根本不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM