简体   繁体   English

在 Javascript 的递归函数中使用正则表达式进行解析

[英]Parsing using regex in recursive functions in Javascript

I want to parse a string which contains shortcodes and push each extracted node into an array.我想解析一个包含短代码的字符串并将每个提取的节点推送到一个数组中。 However the recursive function I have written for this never terminates.然而,我为此编写的递归函数永远不会终止。 What am I doing wrong here?我在这里做错了什么?

var i = 0;
var nodes = [];
var pattern = /(\[sc_(\w+)[\s\w="_-]*\])(.*)(\[\/sc_\2\])/gi;

var extractNodes = function(str, parent) {
    var m;

    if (str.indexOf('[sc_') === -1) return;

    while ((m = pattern.exec(str)) !== null) {
        nodes.push({
            id: i,
            tag: m[2],
            children: m[3],
            parentId: parent
        });
        extractNodes(m[3], i++);
    }
}

extractNodes("[sc_div][sc_span][sc_strong]Foo[/sc_strong][/sc_span][/sc_div]", -1); 

You've got a conflict between your while loop and the global ( g flag ) RegEx.您的 while 循环和全局( g标志)正则表达式之间存在冲突。

Each iteration of the function is sending the same str parameter.函数的每次迭代都发送相同的str参数。 You can fix this by making the RegEx non-global by removing the g flag and while loop.您可以通过删除g标志和while循环使 RegEx 非全局来解决此问题。

Live Demo现场演示

 var i = 0; var nodes = []; var pattern = /(\\[sc_(\\w+)[\\s\\w="_-]*\\])(.*)(\\[\\/sc_\\2\\])/i; // <-- Remove `g` flag var extractNodes = function (str, parent) { var m; if (str.indexOf('[sc_') === -1) return; if ((m = pattern.exec(str)) !== null) { nodes.push({ id: i, tag: m[2], children: m[3], parentId: parent }); extractNodes(m[3], i++); } } extractNodes("[sc_div][sc_span][sc_strong]Foo[/sc_strong][/sc_span][/sc_div]", -1); console.log(nodes); document.body.innerHTML = '<pre>' + JSON.stringify(nodes, 0, 4) + '</pre>'; // For DEMO purpose only

Console Output (Chrome):控制台输出(Chrome):

[Object, Object, Object] [物体,物体,物体]
0:Object 0:对象
children: "[sc_span][sc_strong]Foo[/sc_strong][/sc_span]"孩子们:“[sc_span][sc_strong]Foo[/sc_strong][/sc_span]”
id: 0编号:0
parentId: -1父 ID:-1
tag: "div"标签: "div"
__proto__: Object __proto__:对象
1:Object 1:对象
children: "[sc_strong]Foo[/sc_strong]"孩子们:“[sc_strong]Foo[/sc_strong]”
id: 1编号:1
parentId: 0父 ID:0
tag: "span"标签:“跨度”
__proto__: Object __proto__:对象
2:Object 2:对象
children: "Foo"孩子们:“噗”
id: 2编号:2
parentId: 1父 ID:1
tag: "strong"标签:“强”
__proto__: Object __proto__:对象
length: 3长度:3
__proto__: Array[0] __proto__:数组[0]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM