HTML列表为CSV

我有一个多级列表,例如下面:

<ul> <li>Test column 01 <ul> <li>Test column 02 <ul> <li>Test column 03 <ul> <li>Test column 04 <ul> <li>Test column 05</li> <li>Test column 05</li> <li>Test column 05</li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> 

我想运行一些php代码,将列表输出为csv文件,格式如下:

 Test column 01 ,Test column 02 ,,Test column 03 ,,,Test column 04 ,,,,Test column 05 ,,,,Test column 05 ,,,,Test column 05 

基本上,我希望能够通过一些php代码运行一个html列表(无限级别),并输出一个可以在excel中打开的csv文件,保存列表中的列表级别。

如果我能find某种方式为每个列表项添加一个类,根据它的级别,所以一级列表项获得一个级别1,二级,一级2等等的类,那么它应该是相当直接的发现和replace其余的。

任何想法/帮助不胜感激。

这将适用于您的示例HTML:

 $dom = new DOMDocument; $dom->preserveWhiteSpace = false; $dom->loadHTML($html); foreach ($dom->getElementsByTagName('li') as $li) { // #1 printf( '%s%s%s', str_repeat(',', get_depth($li)), // #2 trim($li->childNodes->item(0)->nodeValue), // #3 PHP_EOL ); } function get_depth(DOMElement $element) { $depth = -1; while ( // #4 $element->parentNode->tagName === 'li' || $element->parentNode->tagName === 'ul' ) { if ($element->parentNode->tagName === 'ul') { // #5 $depth++; } $element = $element->parentNode; } return $depth; } 

你可以在这里看到演示 。

标记的解释:

  1. 我们在Markup中获取所有的LI元素,而不pipe它们的位置。 如果您只想获取特定的UL块,请使用保存起始UL元素的DOMElement中的getElementsByTagName。 我把它留给你来弄清楚如何做到这一点。
  2. 我们为每个计算的深度添加一个逗号。 深度等于当前LI元素之上的UL元素的量
  3. 我们只需要获取LI元素的第一个子节点,假设它是你想要的文本节点。 如果真正的标记不仅包含文本节点和潜在的UL元素,还需要调整它以仅包含所需的文本内容。 我们正在修剪文本结果,以删除LI元素中存在子UL元素时将出现的换行符。
  4. 得到我们遍历DOM树的深度,直到没有更多的LI或UL元素。
  5. 由于我们希望每个UL元素在初始LI之上有一个逗号,所以如果父节点是UL元素,我们只添加+1到$深度