2016-04-04 46 views
1

我想解析包含簡碼的字符串,並將每個提取的節點推送到數組中。然而,我爲此編寫的遞歸函數永遠不會終止。我在這裏做錯了什麼?使用正則表達式在Javascript中的遞歸函數中解析

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); 
+2

你能告訴我們什麼輸出將是你的榜樣嗎? – JordanHendrix

+2

在遞歸函數中錯過了'return'。 ['return extractNodes(m [3],i ++);'](https://jsfiddle.net/tusharj/p4jkkado/) – Tushar

+0

@Tushar返回似乎不是問題。有一些關於正則表達式的問題,它爲每次迭代發送相同的'str'參數:https://jsfiddle.net/igor_9000/9yaz6cdu/ –

回答

1

你有你的while循環和全球(g標誌)正則表達式之間的衝突。

函數的每次迭代都發送相同的str參數。您可以通過刪除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

控制檯輸出(鉻):

[對象,對象,對象]
0:對象
   小孩: 「[sc_span] [sc_strong]的Foo [/ sc_strong] [/ sc_span]」
    ID:0
    parentId的:-1
   標籤: 「DIV」
    __proto__:對象
1:對象
   小孩: 「[sc_strong]的Foo [/ sc_strong]」
    ID:1
   的parentId:0
   標籤: 「跨度」
    __proto__:對象
2:對象
   孩子: 「富」
    ID:2
   的parentId:1
   標記:「strong」
    __proto__:對象
長度:3
__proto__:數組[0]

+1

啊,對!不需要「時間」。 – Tushar

+0

感謝您的回覆。但是當有兄弟姐妹時,這不起作用。想象下面的輸入: '''[sc_div] [sc_span] [sc_strong] Foo [/ sc_strong] [/ sc_span] [/ sc_div] [sc_div] [sc_span] [sc_strong] Bar [/ sc_strong] [/ sc_span] [/ sc_div]''' – coder9

+0

@ coder9通過使用'?''(\ [sc _(\ w +)[\ s \ w =「_-] * \])(。*?)使正則表達式爲'non-greedy' )(\ [\/SC_ \ 2 \])' – rock321987

相關問題