如何获取字符串中嵌套标签的完整内容?

如何获取字符串中嵌套标签的完整内容?

获取字符串指定标签含嵌套标签的内容

如何获取类似以下字符串中的最外层所有 <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);

以上就是如何获取字符串中嵌套标签的完整内容?的详细内容,更多请关注其它相关文章!