내 의견에 대한 경고와 함께 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이 없기 때문에 확인하지 않아야합니다.
그런 다음 regexp 일치의 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을 구문 분석합니까? –
@ SebastianPaaskeTorholm Javascript – lawls
bbcode 파싱을 수행할만한 이유가 있습니까? 그렇다면 정규 표현식을 사용하여 파싱하는 것이 지금까지만 가능하다는 것을 알아야합니다 (예 : '$ 15.99'및 '15.99'와 같은 가격 문자열 정규화와 같은 단순한 작업은 모두 '15.99'를 반환해야 함). 그러나 bbcode와 같이 스펙트럼의 다른면에서 멀리있는 곳에서는 lex 및 yacc와 같은 도구로 만들어진 실제 파서가 필요합니다. 며칠 후에 이것들을 배울 수 있습니다. 정규 표현식에 의지하지 않는 이유는 그것이 쉽다고 생각하기 때문입니다. Jison을 사용하여 JS에서 파서를 작성할 수도 있습니다. – guillaume