0

我正在尝试从包含一些 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
};

然后我会将对象发送到渲染函数,该函数将从它递归地创建画布文本。但我就是想不通,如何形成这个物体。

4

1 回答 1

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]});
    }
})

输出格式与您发布的格式不同,但这应该没问题。

http://jsfiddle.net/L8UZf/

于 2013-08-24T08:34:46.817 回答