私のコメントの警告に従って、URL の文字をホワイトリストに登録することをお勧めします: az、0-9、&、.、/、?、:、= など。次に、.*?
を許可された文字に置き換えます。
/\[img\]([a-z0-9:&?=\/\.%]+?)\[\/img\]/ig
/\[url\=([a-z0-9:&?=\/\.%]+?)\](.*?)\[\/url\]/ig
これは、国際的な URL を除いて、私が考えるほとんどのケースをカバーします。この正規表現では引用符を使用できないため、引用符をエスケープする必要はありません。と表現するつもり%22
でした。また、これは URL を検証しませんが、私が信じている XSS から保護するだけです。
[url] と [img] は両方とも URL を取るため、正規表現のこの部分は同じです。また、多くの画像には明示的な拡張子を持つ URL がないため、.png や .jpeg をチェックしないでください。
次に、正規表現一致の 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);
});