隨着我評論中的注意事項,我建議你只是將URL列入白名單字符:az,0-9,&,。,/,?,:,=等。然後用允許的字符替換.*?
:
/\[img\]([a-z0-9:&?=\/\.%]+?)\[\/img\]/ig
/\[url\=([a-z0-9:&?=\/\.%]+?)\](.*?)\[\/url\]/ig
這將覆蓋大多數情況下,我認爲,除了國際網址。這個正則表達式不允許使用引號,所以不需要轉義它們。他們的意思是表示爲%22
。此外,這不會驗證網址,但只保護XSS我相信。
[url]和[img]都帶一個URL,所以這部分正則表達式是相同的。而且你不應該檢查.png或.jpeg,因爲許多圖像沒有帶有明確擴展名的URL。
然後,正則表達式匹配中的url組只需要轉義爲HTML。
Full code:
var imgRe = /\[img\]([a-z0-9:&?=\/\.%;]+?)\[\/img\]/ig;
var linkRe = /\[url\=([a-z0-9:&?=\/\.%;]+?)\](.*?)\[\/url\]/ig
$('#convert').click(function() {
var output = $('#bbcode').val();
// Escape HTML special characters
// It's wrong to escape them before converting the bbcode into HTML
// but I couldn't think of issues
output = output.replace(/&/g, '&');
output = output.replace(/</g, '<');
output = output.replace(/"/g, '"');
// Convert bbcode
output = output.replace(imgRe, function(str, url) {
return '<img src="' + url + '"/>';
});
output = output.replace(linkRe, function(str, url, txt) {
return '<a href="' + url + '">' + txt + '</a>';
});
// print output
$('#pre').html(output);
});
哪種語言,你解析BBcodes嗎? –
@SebastianPaaskeTørholmJavascript – lawls
是否有任何理由推出自己的bbcode解析?如果是這樣,你應該知道使用正則表達式解析只能得到你(簡單的東西,如標準化價格字符串,例如「$ 15.99」和「15.99」都必須返回「15.99」)。但是對於任何與bbcode相反的東西,您需要一個真正的解析器,這種解析器使用lex和yacc等工具構建。你可以在幾天內學習這些,不要訴諸於正則表達式,因爲你認爲它們更容易。你甚至可以使用Jison編寫JS解析器 – guillaume