我编写了一个类似于我用来编写此消息的 Javascript bbcode。它还包含一个实时预览框,如下所示。我目前面临的唯一问题是一些嵌套的 bbcode 没有解析。
例如:
[quote]
[quote][/quote]
[/quote]
解析不正确。
这是我目前的 Javascript。
function preview() {
var txt = $('#editor').val();
txt = txt.replace(/</g,'<');
txt = txt.replace(/>/g,'>');
txt = txt.replace(/[\r\n]/g,'%lb%');
var find = [
/\[quote\](.*?)\[\/quote\]/gi,
/\[quote author="(.*?)" date="(.*?)"\](.*?)\[\/quote\]/gi,
/\[b\](.*?)\[\/b\]/gi,
/\[i\](.*?)\[\/i\]/gi,
/\[u\](.*?)\[\/u\]/gi,
/\[left\](.*?)\[\/left\]/gi,
/\[center\](.*?)\[\/center\]/gi,
/\[right\](.*?)\[\/right\]/gi,
/\[size=(10|12|24|30)](.*?)\[\/size\]/gi,
/\[font=(.*?)](.*?)\[\/font\]/gi,
/\[color=(.*?)](.*?)\[\/color\]/gi,
/\[url(?:\=?)(.*?)\](.*?)\[\/url\]/gi,
/\[email=(.*?)\](.*?)\[\/email\]/gi,
/\[email\](.*?)\[\/email\]/gi,
/\[img(.*?)\](.*?)\[\/img\]/gi,
/(?:%lb%|\s)*\[code(?:\=?)(?:.*?)\](?:%lb%|\s)*(.*?)(?:%lb%|\s)*\[\/code\](?:%lb%|\s)*/gi,
/\[list(.*?)\](.*?)\[\*\](.*?)(?:%lb%|\s)*(\[\*\].*?\[\/list\]|\[\/list\])/i,
/(?:%lb%|\s)*\[list\](?:%lb%|\s)*(.*?)(?:%lb%|\s)*\[\/list\](?:%lb%|\s)*/gi,
/(?:%lb%|\s)*\[list=(\d)\](?:%lb%|\s)*(.*?)(?:%lb%|\s)*\[\/list\](?:%lb%|\s)*/gi,
/(?:%lb%){3,}/g
];
var replace = [
'<blockquote><div class="quote"><div class="quote_body">$1</div></div></blockquote>',
'<blockquote><div class="quote"><div class="quote_author"><span class="quote_from">Quote from</span> <span class="author">$1</span> on <span class="date">$2</span></div><div class="quote_body">$3</div></div></blockquote>',
'<b>$1<\/b>',
'<i>$1<\/i>',
'<u>$1<\/u>',
'<div class="align_left">$1<\/div>',
'<div class="align_center">$1<\/div>',
'<div class="align_right">$1<\/div>',
'<span style="font-size:$1px;">$2</span>',
'<span style="font-family:$1;">$2</span>',
'<span style="color:$1;">$2</span>',
'<a href="$1">$2</a>',
'<a href="mailto:$1">$2</a>',
'<a href="mailto:$1">$1</a>',
'<img $1 src="$2" />',
'<pre><code>$1</code></pre>',
'[list$1]$2<li>$3</li>$4',
'<ul>$1</ul>',
'<ol start=$1>$2</ol>',
'%lb%%lb%'
];
// fix [*] so that they only work inside [/list]
for(var i in find)
{
txt = txt.replace(find[i],replace[i]);
if(i == 17) while(txt.match(find[i],replace[i])) txt = txt.replace(find[i],replace[i]);
}
// Fix Smilies
txt = txt.replace(/%lb%/g,'<br />');
txt = txt.replace(/\:\)/g, '<img class="smiley" src="/img/smilies/smile.gif">');
txt = txt.replace(/\:-\)/g, '<img class="smiley" src="/img/smilies/happy.gif">');
txt = txt.replace(/\:D/g, '<img class="smiley" src="/img/smilies/biggrin.gif">');
txt = txt.replace(/\:\(/g, '<img class="smiley" src="/img/smilies/sad.gif">');
txt = txt.replace(/8\)/g, '<img class="smiley" src="/img/smilies/cool.gif">');
txt = txt.replace(/=O/g, '<img class="smiley" src="/img/smilies/surprised.gif">');
txt = txt.replace(/\:-\|\|/g, '<img class="smiley" src="/img/smilies/mad.gif">');
txt = txt.replace(/\:P/g, '<img class="smiley" src="/img/smilies/stongue.gif">');
txt = txt.replace(/\}\-\(/g, '<img class="smiley" src="/img/smilies/confused.gif">');
// Format Dates
txt = txt.replace(/\d{10}/g, function($0) {
var d = new Date($0*1000);
var months = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
return "" + months[d.getMonth()] + " " + d.getDate() + ", " + d.getFullYear() + ", " + (d.getHours()%12) + ":" + d.getMinutes() + " " + (d.getHours()<12 ? 'AM' : 'PM');
});
// Update the preview box
$('.preview').html(txt);
}
这翻转了我所有的 bbcode 标签。引用标签的问题在于它有时不会翻转嵌套的引用标签或解析内部引用标签的内容。
如果有人能够提供解决方案,我将不胜感激。谢谢!