2016-01-07 88 views
2

我正在使用這個(http://coursesweb.net/javascript/convert-bbcode-html-javascript_cs)作爲解析BBCode的腳本。我已經擴展了可以處理的BBCodes,但是當新行緊跟在開始標記後面時遇到了問題,例如,在Javascript中解析BBCode

[code] 
    code.... 
    [/code] 

如果代碼是'

正則表達式用來匹配什麼是這些標籤中「內聯」 [code]code.... [/代碼]不會發生的問題是(.*?)我知道不匹配換行符。我試過([^\r\n])來匹配換行符,但這也沒有奏效。

我想這是一個簡單的問題,但我有一個正則表達式,因此任何幫助,將不勝感激一點經驗

編輯:這是正則表達式的完整清單,我使用

var tokens = { 
'URL' : '((?:(?:[a-z][a-z\\d+\\-.]*:\\/{2}(?:(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})+|[0-9.]+|\\[[a-z0-9.]+:[a-z0-9.]+:[a-z0-9.:]+\\])(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})*)*(?:\\?(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?(?:#(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?)|(?:www\\.(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})+(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~\\!$&\'*+,;=:@|]+|%[\\dA-F]{2})*)*(?:\\?(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?(?:#(?:[a-z0-9\\-._~\\!$&\'*+,;=:@\\/?|]+|%[\\dA-F]{2})*)?)))', 
'LINK' : '([a-z0-9\-\./]+[^"\' ]*)', 
'EMAIL' : '((?:[\\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\\w\!\#$\%\'\*\+\-\/\=\?\^\`{\|\}\~]|&)[email protected](?:(?:(?:(?:(?:[a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(?:\\d{1,3}\.){3}\\d{1,3}(?:\:\\d{1,5})?))', 
'TEXT' : '(.*?)', 
'SIMPLETEXT' : '([a-zA-Z0-9-+.,_ ]+)', 
'INTTEXT' : '([a-zA-Z0-9-+,_. ]+)', 
'IDENTIFIER' : '([a-zA-Z0-9-_]+)', 
'COLOR' : '([a-z]+|#[0-9abcdef]+)', 
'NUMBER' : '([0-9]+)', 
'ALL' : '([^\r\n])', 

}; 

編輯2:全部JS進行匹配

var token_match = /{[A-Z_]+[0-9]*}/ig; 


var _getRegEx = function(str) { 
var matches = str.match(token_match); 
var nrmatches = matches.length; 
var i = 0; 
var replacement = ''; 

if (nrmatches <= 0) { 
    return new RegExp(preg_quote(str), 'g');  // no tokens so return the escaped string 
} 

for(; i < nrmatches; i += 1) { 
    // Remove {, } and numbers from the token so it can match the 
    // keys in tokens 
    var token = matches[i].replace(/[{}0-9]/g, ''); 

    if (tokens[token]) { 
    // Escape everything before the token 
    replacement += preg_quote(str.substr(0, str.indexOf(matches[i]))) + tokens[token]; 

    // Remove everything before the end of the token so it can be used 
    // with the next token. Doing this so that parts can be escaped 
    str = str.substr(str.indexOf(matches[i]) + matches[i].length); 
    } 
} 

replacement += preg_quote(str);  

return new RegExp(replacement, 'gi'); 
}; 


var _getTpls = function(str) { 
var matches = str.match(token_match); 
var nrmatches = matches.length; 
var i = 0; 
var replacement = ''; 
var positions = {}; 
var next_position = 0; 

if (nrmatches <= 0) { 
    return str;  // no tokens so return the string 
} 

for(; i < nrmatches; i += 1) { 
    // Remove {, } and numbers from the token so it can match the 
    // keys in tokens 
    var token = matches[i].replace(/[{}0-9]/g, ''); 
    var position; 

    // figure out what $# to use ($1, $2) 
    if (positions[matches[i]]) { 
    position = positions[matches[i]];  
    } else { 
    // token doesn't have a position so increment the next position 
    // and record this token's position 
    next_position += 1; 
    position = next_position; 
    positions[matches[i]] = position; 
    } 

    if (tokens[token]) { 
    replacement += str.substr(0, str.indexOf(matches[i])) + '$' + position; 
    str = str.substr(str.indexOf(matches[i]) + matches[i].length); 
    } 
} 

replacement += str; 

return replacement; 
}; 
+1

你能提供整個正則表達式嗎? – Freddy

+0

另請參見:您的內嵌[代碼]中存在拼寫錯誤。您在結束標記前缺少結束斜線。 – Freddy

+0

@Freddy我已經更新了這個問題,謝謝 – user5697101

回答

1

這是否把戲對我來說:(更新這一個了,以避免混淆)

\[code\]((?:.|\t|\n|\r)*?)\[\/code\] 

regexpal並輸入以下內容:

[code] 
    code.... 
[/code] 

[code]code.... [/code] 

更新: 固定的正則表達式以下內容適用於我的Chrome控制檯:

/\[code\]((?:.|\t|\n|\r)*?)\[\/code\]/g.exec("[code]hello world \n[/code]") 
+0

這適用於regexpal,但僅當我實現時才顯示[code]標記之間的最後一個字符 – user5697101

+0

您使用的是什麼JS代碼匹配嗎? – Freddy

+0

我已經添加了匹配字符串的函數 – user5697101

1

JavaScript不處理多行RegExp匹配。相反,您必須使用this SO answer中描述的[\s\S]技巧。也許?

/\[code\][\s\S]*\[code\]/ 

此外,RegExps可能不是解析語法的最佳選擇。這是非常複雜的。我會建議解析字符串並構建一個抽象語法樹,然後從中渲染HTML。

+0

雖然這在regexpal中完美解決,但它在實現時並沒有任何效果 – user5697101