根据我的评论中的警告,我建议您将 URL 的字符列入白名单:az、0-9、&、.、/、?、:、= 等。然后将 替换为.*?
您允许的字符:
/\[img\]([a-z0-9:&?=\/\.%]+?)\[\/img\]/ig
/\[url\=([a-z0-9:&?=\/\.%]+?)\](.*?)\[\/url\]/ig
这将涵盖我认为的大多数情况,但国际 URL 除外。此正则表达式中不允许使用引号,因此无需转义它们。它们的意思是表示为%22
。此外,这不会验证 URL,但我相信只能防止 XSS。
[url] 和 [img] 都带有一个 URL,所以这部分正则表达式是相同的。而且您不应该检查 .png 或 .jpeg,因为许多图像没有带有显式扩展名的 URL。
那么正则表达式匹配中的 url 组将只需要为 HTML 进行转义。
完整代码:
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);
});