[loop]
aaaaaa
[loop]
bbbbbb
[loop]
cccccc
[/loop]
[/loop]
        [loop]
             eeeee
        [/loop]
[/loop]
已知字符串格式如上。请好心人帮用递归方式把包含在[loop]和[/loop]
标签内的字符取出来(注:[loop]和[/loop]有多少层不定,请不要用
正则或字符替换“[loop]”方式,因为标签不一定是[loop],有可能是<aaa></aaa>,{bbb}{/bbb}等)

解决方案 »

  1.   

    [loop]
    aaaaaa
    [loop]
    bbbbbb
    [loop]
    cccccc
    [/loop]
    [/loop]
            [loop]
                eeeee
            [/loop]
    [/loop] 应该是
    [loop]
    aaaaaa
    [/loop]
    [loop]
    bbbbbb
    [/loop]
    [loop]
    cccccc
    [/loop]
    [loop]
            [loop]
                eeeee
            [/loop]
    [/loop]  ?
      

  2.   

    应该是:[loop]
         aaaaaa
         [loop]
              bbbbbb
              [loop]
              cccccc
              [/loop]
         [/loop]
            [loop]
                eeeee
            [/loop]
    [/loop] 
      

  3.   

    1、正则表达式并非大逆不道,php提供的正则表达式功能非常强大。使用的好,可以取得事半功倍的效果
    2、是否需要递归,取决于你需要得到的结果。由于递归需要通过堆栈记忆层次在嵌套层次深的时候有可能内存耗尽而失败。其实大多数递归操作都可以化为顺序操作的
    3、如果你需要下面的结果
    Array
    (
        [0] => Array
            (
                [_text] => aaaaaa
                [deep] => 1
            )    [1] => Array
            (
                [_text] => bbbbbb
                [deep] => 2
            )    [2] => Array
            (
                [_text] => cccccc
                [deep] => 3
            )    [3] => Array
            (
                [_text] => eeeee
                [deep] => 2
            ))
    那么可以
    $s = <<< TEXT
    [loop] 
        aaaaaa 
        [loop] 
              bbbbbb 
              [loop] 
              cccccc 
              [/loop] 
        [/loop] 
            [loop] 
                eeeee 
            [/loop] 
    [/loop] 
    TEXT;//用正则表达式切割字符串
    $r = preg_split("/\[(\/?\w+)\]\s*/", $s, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);$deep = 0;//记录层次
    $tag = 'loop';
    for($i=0;$i<count($r);$i++) {
      if($r[$i] == "/$tag") {
        $deep--;
        continue;
      }
      if($r[$i] == $tag) {
        $deep++;
        continue;
      }
      $o[] = array('_text' => trim($r[$i]), 'deep' => $deep);
    }
    print_r($o);当最后的 $deep 不等于 0 时,表示标记嵌套有误
      

  4.   

    非常感谢楼上的,但我的问题是用递归去解决合适的。
    现在要做的是:
    [loop:human] 
        aaaaaa 
        [loop:woman] 
              bbbbbb 
              [loop:girl] 
              cccccc 
              [/loop:girl] 
        [/loop:woman] 
            [loop:man] 
                eeeee 
            [/loop:man] 
    [/loop:human] 
    标签冒后的指示符是根据需要变化的,大侠能帮解决下吗