如何获取字符串中嵌套标签的完整内容?
获取字符串指定标签含嵌套标签的内容
如何获取类似以下字符串中的最外层所有 <if xx>if> 标签及其包含的内容?
$str = " {if 'a'} 111111 {if 'c'}33333{/if} {if 'd'}44444{/if} ...... {/if} {if 'b'}22222{/if} ";
期望得到:
[ "{if 'a'} 111111 {if 'c'}33333{/if} {if 'd'}44444{/if} ...... {/if}", "{if 'b'}22222{/if}" ]
虽然可以使用正则获取标签内容,但由于嵌套的存在,需要更复杂的处理。
代码实现:
$stack = []; $top = null; $result = []; preg_match_all('!({/?if)!', $str, $matches, PREG_OFFSET_CAPTURE); foreach ($matches[0] as [$match, $offset]) { if ($match === '{if') { $stack[] = $offset; if ($top === null) { $top = $offset; } } else { $pop = array_pop($stack); if ($pop === null) { throw new Exception('语法错误,存在多余的 {/if} 标签'); } if (empty($stack)) { $newOffset = $offset + strlen($match); $result[] = substr($str, $top, $newOffset); $top = $newOffset + 1; } } } if (!empty($stack)) { throw new Exception('语法错误,存在未闭合的 {if} 标签'); } var_dump($result);
以上就是如何获取字符串中嵌套标签的完整内容?的详细内容,更多请关注其它相关文章!