我正在尝试使用包含一些bbcode的给定字符串在javascript中创建一个对象。
var bbStr = 'Text with [url=http://somelink]links and [i]nested bb code[/i][/url].';
我需要递归迭代对象并将上面的字符串转换成这样的字符:
var result = {
children : [
{
text : 'Text with ',
type : 'text'
},
{
children: [
{
text : 'links and ',
type : 'text'
},
{
text : 'nested bb code',
type : 'italic'
}
],
text : null,
type : 'url',
url : 'http://somelink'
},
{
text : '.',
type : 'text'
}
],
type : null,
text : null
};
然后我将对象发送到渲染函数,该函数将从中递归创建画布文本。但我无法理解,如何形成这个对象。
答案 0 :(得分:1)
尝试这个简单的基于堆栈的解析器:
token = /(?:\[(\w+)(.*?)\])|(?:\[\/(\w+)\])|([^\[\]]+)/g
root = {children:[]}
stack = [root]
bbStr.replace(token, function() {
var a = arguments;
if(a[1]) {
var node = {tag: a[1], attr: a[2], children:[]}
stack[0].children.push(node);
stack.unshift(node);
} else if(a[3]) {
if(stack[0].tag != a[3])
throw "Unmatched tag";
stack.shift();
} else if(a[4]) {
stack[0].children.push({tag: "#text", value: a[4]});
}
})
输出格式与您发布的格式不同,但这应该没问题。