2016-04-04 4 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をグローバル化しないでください。

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

Live Demo

コンソール出力(クロム):

[オブジェクト、オブジェクト、オブジェクト]
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:オブジェクト
   子供: "foo" という
    ID:2
    PARENTID:1
   タグ: "strong"
    __proto__:オブジェクト
長さ:3
__proto__:配列[0]

+1

ああ、そうです!'while 'の必要はありません。 – Tushar

+0

ご返信ありがとうございます。しかし、これは兄弟がいるときは機能しません。 '' '[sc_div] [sc_span] [sc_strong] Foo [/ sc_span] [/ sc_div] [sc_div] [sc_span] [sc_strong]バー[/ sc_strong] [/ sc_span] \ {sc_div} '' ' – coder9

+0

@ coder9'? ''(\ [sc _(\ w +)[\ s \ w = "_-] * \])を使用して正規表現を非貪欲にする。 )(\ [\/sc_ \ 2 \]) ' – rock321987

関連する問題