document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-69613\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"cp\">&lt;?php<\/span><\/div><div class=\"line\" id=\"LC2\">&nbsp;<\/div><div class=\"line\" id=\"LC3\"><span class=\"nv\">$bbcode<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;[p][url=http://www.gmail.com][u]gmail[/u][/url]&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC4\"><span class=\"nv\">$bbcode<\/span> <span class=\"o\">.=<\/span> <span class=\"s1\">&#39;[b][size=3]foo[/size][/b]&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC5\"><span class=\"nv\">$bbcode<\/span> <span class=\"o\">.=<\/span> <span class=\"s1\">&#39;[color=red][u][i]bar[/i][/u][/color][/p]&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;<\/div><div class=\"line\" id=\"LC7\"><span class=\"nv\">$root<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">BBCodeNode<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;root&#39;<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC8\"><span class=\"nv\">$root<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">build_tree<\/span><span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$root<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC9\"><span class=\"k\">echo<\/span> <span class=\"s1\">&#39;BBCode: &#39;<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$bbcode<\/span><span class=\"p\">,<\/span> <span class=\"s2\">&quot;<\/span><span class=\"se\">\\n\\n<\/span><span class=\"s2\">&quot;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC10\"><span class=\"nx\">traverse_tree<\/span><span class=\"p\">(<\/span><span class=\"nv\">$root<\/span><span class=\"p\">,<\/span> <span class=\"s1\">&#39;printer&#39;<\/span><span class=\"p\">,<\/span> <span class=\"m\">0<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC11\">&nbsp;<\/div><div class=\"line\" id=\"LC12\"><span class=\"k\">function<\/span> <span class=\"nf\">build_tree<\/span><span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC13\"><span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC14\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span> <span class=\"o\">==<\/span> <span class=\"s1\">&#39;&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC15\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC16\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC17\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$i<\/span> <span class=\"o\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"m\">0<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;[&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">// text node<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$text<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;[&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$text<\/span> <span class=\"o\">.=<\/span> <span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">};<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC24\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC25\">&nbsp;<\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">BBCodeNode<\/span><span class=\"p\">(<\/span><span class=\"nv\">$text<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">type<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;text&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC28\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">value<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$text<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">parentNode<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC30\">&nbsp;<\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">children<\/span><span class=\"p\">[<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">childCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$child<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC32\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">++<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">childCount<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$node<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">build_tree<\/span><span class=\"p\">(<\/span><span class=\"nb\">substr<\/span><span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$i<\/span><span class=\"p\">),<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC35\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC36\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC37\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC38\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;/&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC39\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">// a open tag<\/span><\/div><div class=\"line\" id=\"LC40\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$state<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;in_open_tag&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC41\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$open_tag<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC42\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$param<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC43\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;]&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC44\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;=&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC45\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$open_tag<\/span> <span class=\"o\">.=<\/span> <span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">};<\/span><\/div><div class=\"line\" id=\"LC46\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC47\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC48\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$state<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;in_param&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC49\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">break<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC50\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC51\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span>    <\/div><div class=\"line\" id=\"LC52\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$state<\/span> <span class=\"o\">==<\/span> <span class=\"s1\">&#39;in_param&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC53\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">while<\/span><span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;]&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC54\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$param<\/span> <span class=\"o\">.=<\/span> <span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">};<\/span><\/div><div class=\"line\" id=\"LC55\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC56\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$state<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;in_open_tag&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC57\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span>    <\/div><div class=\"line\" id=\"LC58\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$state<\/span> <span class=\"o\">==<\/span> <span class=\"s1\">&#39;in_open_tag&#39;<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">==<\/span> <span class=\"s1\">&#39;]&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC59\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">// open_tag finished<\/span><\/div><div class=\"line\" id=\"LC60\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">BBCodeNode<\/span><span class=\"p\">(<\/span><span class=\"nv\">$open_tag<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC61\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$param<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC62\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">param<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$param<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC63\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC64\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$child<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">parentNode<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC65\">&nbsp;<\/div><div class=\"line\" id=\"LC66\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">children<\/span><span class=\"p\">[<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">childCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$child<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC67\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">++<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">childCount<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC68\">&nbsp;<\/div><div class=\"line\" id=\"LC69\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$node<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">build_tree<\/span><span class=\"p\">(<\/span><span class=\"nb\">substr<\/span><span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">,<\/span> <span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">),<\/span> <span class=\"nv\">$child<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC70\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"nv\">$node<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC71\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC72\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;invalid bbcode, index[&#39;<\/span> <span class=\"o\">.<\/span> <span class=\"nv\">$i<\/span> <span class=\"o\">.<\/span> <span class=\"s1\">&#39;]&#39;<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC73\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC74\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC75\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">// a close tag<\/span><\/div><div class=\"line\" id=\"LC76\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c1\">// skip close tag<\/span><\/div><div class=\"line\" id=\"LC77\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">while<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">{<\/span><span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">}<\/span> <span class=\"o\">!=<\/span> <span class=\"s1\">&#39;]&#39;<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC78\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC79\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC80\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">parentNode<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC81\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"o\">++<\/span><span class=\"nv\">$i<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC82\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">parentNode<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">build_tree<\/span><span class=\"p\">(<\/span><span class=\"nb\">substr<\/span><span class=\"p\">(<\/span><span class=\"nv\">$bbcode<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$i<\/span><span class=\"p\">),<\/span> <span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">parentNode<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC83\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">return<\/span> <span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">parentNode<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC84\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC85\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Exception<\/span><span class=\"p\">(<\/span><span class=\"s1\">&#39;bbcode not match, index[&#39;<\/span> <span class=\"o\">.<\/span> <span class=\"nv\">$i<\/span> <span class=\"o\">.<\/span> <span class=\"s1\">&#39;]&#39;<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC86\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC87\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC88\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC89\"><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC90\">&nbsp;<\/div><div class=\"line\" id=\"LC91\"><span class=\"k\">function<\/span> <span class=\"nf\">traverse_tree<\/span><span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$handler<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$depth<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC92\"><span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC93\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$handler<\/span><span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$depth<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC94\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">childCount<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC95\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">foreach<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">children<\/span> <span class=\"k\">as<\/span> <span class=\"nv\">$v<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC96\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nx\">traverse_tree<\/span><span class=\"p\">(<\/span><span class=\"nv\">$v<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$handler<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$depth<\/span> <span class=\"o\">+<\/span> <span class=\"m\">1<\/span><span class=\"p\">);<\/span><\/div><div class=\"line\" id=\"LC97\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC98\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC99\"><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC100\">&nbsp;<\/div><div class=\"line\" id=\"LC101\"><span class=\"k\">function<\/span> <span class=\"nf\">printer<\/span><span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$depth<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC102\"><span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC103\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">for<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$i<\/span> <span class=\"o\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span> <span class=\"nv\">$i<\/span> <span class=\"o\">&lt;<\/span> <span class=\"nv\">$depth<\/span><span class=\"p\">;<\/span> <span class=\"nv\">$i<\/span><span class=\"o\">++<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC104\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">echo<\/span> <span class=\"s1\">&#39;  &#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC105\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC106\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">echo<\/span> <span class=\"s1\">&#39;node(&#39;<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">name<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC107\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">param<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC108\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">echo<\/span> <span class=\"s1\">&#39;=&#39;<\/span><span class=\"p\">,<\/span> <span class=\"nv\">$node<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">param<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC109\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC110\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">echo<\/span> <span class=\"s2\">&quot;)<\/span><span class=\"se\">\\n<\/span><span class=\"s2\">&quot;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC111\"><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC112\">&nbsp;<\/div><div class=\"line\" id=\"LC113\"><span class=\"k\">class<\/span> <span class=\"nc\">BBCodeNode<\/span><\/div><div class=\"line\" id=\"LC114\"><span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC115\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">public<\/span> <span class=\"nv\">$name<\/span> <span class=\"o\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC116\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">public<\/span> <span class=\"nv\">$parentNode<\/span> <span class=\"o\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC117\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">public<\/span> <span class=\"nv\">$children<\/span> <span class=\"o\">=<\/span> <span class=\"k\">array<\/span><span class=\"p\">();<\/span><\/div><div class=\"line\" id=\"LC118\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">public<\/span> <span class=\"nv\">$childCount<\/span> <span class=\"o\">=<\/span> <span class=\"m\">0<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC119\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">public<\/span> <span class=\"nv\">$type<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">&#39;node&#39;<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC120\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">public<\/span> <span class=\"nv\">$value<\/span> <span class=\"o\">=<\/span> <span class=\"k\">null<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC121\">&nbsp;<\/div><div class=\"line\" id=\"LC122\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">function<\/span> <span class=\"nf\">__construct<\/span><span class=\"p\">(<\/span><span class=\"nv\">$name<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC123\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC124\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"nv\">$this<\/span><span class=\"o\">-&gt;<\/span><span class=\"na\">name<\/span> <span class=\"o\">=<\/span> <span class=\"nv\">$name<\/span><span class=\"p\">;<\/span><\/div><div class=\"line\" id=\"LC125\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC126\"><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC127\">&nbsp;<\/div><div class=\"line\" id=\"LC128\"><span class=\"cp\">?&gt;<\/span><span class=\"x\"><\/span><\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/69613/9afef72f9e42fe408fb93701e5ebff01bbb3c902/bbcode-parser.php\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/69613#file_bbcode_parser.php\" style=\"float:right;margin-right:10px;color:#666\">bbcode-parser.php<\/a>\n          <a href=\"http://gist.github.com/69613\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
