PHP如何将仅含ol/li标签的HTML项目符号列表转换为多维数组
PHP实现仅含ol/li的HTML有序列表转多维数组
以下为可直接运行的实现方案,基于PHP默认自带的DOM扩展开发,无需安装第三方依赖,适配纯ol/li无其他标签的HTML结构,支持任意层级嵌套(包含你需要的4级缩进场景):
function htmlListToArray(string $html): array { // 初始化DOM解析器,屏蔽HTML片段加载的默认警告 $dom = new DOMDocument(); libxml_use_internal_errors(true); // 显式指定编码避免中文乱码 $dom->loadHTML('<?xml encoding="UTF-8">' . $html); libxml_clear_errors(); // 递归解析节点逻辑 $parseNode = function (DOMNode $node) use (&$parseNode) { $result = []; foreach ($node->childNodes as $child) { // 仅处理li标签 if ($child->nodeName === 'li') { $liText = ''; $children = []; // 拆分li内的文本内容和子级ol列表 foreach ($child->childNodes as $liChild) { if ($liChild->nodeName === '#text') { $liText .= trim($liChild->nodeValue); } elseif ($liChild->nodeName === 'ol') { $children = $parseNode($liChild); } } // 组装单条数据结构,可按需调整字段 $item = ['text' => $liText]; if (!empty($children)) { $item['children'] = $children; } $result[] = $item; } } return $result; }; // 从最外层ol开始解析 $rootOl = $dom->getElementsByTagName('ol')->item(0); return $rootOl ? $parseNode($rootOl) : []; }
调用示例
// 测试用的4级嵌套HTML列表 $testHtml = <<<HTML <ol> <li>一级项目1 <ol> <li>二级项目1-1 <ol> <li>三级项目1-1-1</li> <li>三级项目1-1-2 <ol> <li>四级项目1-1-2-1</li> <li>四级项目1-1-2-2</li> </ol> </li> </ol> </li> <li>二级项目1-2</li> </ol> </li> <li>一级项目2</li> </ol> HTML; // 执行转换 $result = htmlListToArray($testHtml); // 打印输出结果 print_r($result);
调整说明
如果不需要text/children的固定键结构,可自行修改$item的组装逻辑:比如无子级时直接存文本、有子级时用当前文本作为键存储子数组即可,适配不同的业务数据格式要求。
内容的提问来源于stack exchange,提问作者Danik10
相关产品推荐
相关产品推荐

