[loop]
aaaaaa
[loop]
bbbbbb
[loop]
cccccc
[/loop]
[/loop]
[loop]
eeeee
[/loop]
[/loop]
已知字符串格式如上。请好心人帮用递归方式把包含在[loop]和[/loop]
标签内的字符取出来(注:[loop]和[/loop]有多少层不定,请不要用
正则或字符替换“[loop]”方式,因为标签不一定是[loop],有可能是<aaa></aaa>,{bbb}{/bbb}等)
aaaaaa
[loop]
bbbbbb
[loop]
cccccc
[/loop]
[/loop]
[loop]
eeeee
[/loop]
[/loop]
已知字符串格式如上。请好心人帮用递归方式把包含在[loop]和[/loop]
标签内的字符取出来(注:[loop]和[/loop]有多少层不定,请不要用
正则或字符替换“[loop]”方式,因为标签不一定是[loop],有可能是<aaa></aaa>,{bbb}{/bbb}等)
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] ?
aaaaaa
[loop]
bbbbbb
[loop]
cccccc
[/loop]
[/loop]
[loop]
eeeee
[/loop]
[/loop]
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 时,表示标记嵌套有误
现在要做的是:
[loop:human]
aaaaaa
[loop:woman]
bbbbbb
[loop:girl]
cccccc
[/loop:girl]
[/loop:woman]
[loop:man]
eeeee
[/loop:man]
[/loop:human]
标签冒后的指示符是根据需要变化的,大侠能帮解决下吗