php - HTML 列表到 CSV

标签 php excel csv html-lists

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

<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 文件,并在列中保留列表级别。

如果我能找到某种方法为每个列表项添加一个类,这取决于它的级别,所以第一级列表项获得一个 level1 类,第二级,一个 level2 类等等,那么它应该相当简单找到并替换其余部分。

非常感谢任何想法/帮助。

最佳答案

这适用于您的示例 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;
}

您可以 see the demo here .

标记说明:

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

关于php - HTML 列表到 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15157876/

相关文章:

reactjs - 如何从 fetch 请求中的 readableStream 响应中获取可下载文件

php - 使用下拉菜单编辑 mysql 数据

arrays - Excel VBA 创建列表并仅添加唯一术语

vba - 无法使用 xhr 从网页中获取一些信息

sql-server - 尝试使用 VBA excel 运行 SQL 查询时出错

excel - 如何防止matlab自动将带有逗号的字符串分隔到csv中的不同单元格?

php - 使用 PHP 在下拉列表中显示选定的国家/地区

php - 火力地堡智威汤逊 : Signature verification failed

php - 将csv文件导入mysql并同时更改日期时间格式

ruby-on-rails - Ruby/Rails,用引号之间的换行符解析 CSV