[英]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 非全局来解决此问题。
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:Object0:对象
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:Object1:对象
children: "[sc_strong]Foo[/sc_strong]"孩子们:“[sc_strong]Foo[/sc_strong]”
id: 1编号:1
parentId: 0父 ID:0
tag: "span"标签:“跨度”
__proto__: Object__proto__:对象
2:Object2:对象
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.