You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

phpdocx库中<li>嵌套<p>导致docx列表格式错乱问题求助

phpdocx处理
  • 嵌套

    标签时列表格式错乱问题解决思路

  • 问题描述

    使用phpdocx库将HTML内容生成docx文件时,遇到

  • 标签内嵌套

    标签的场景,生成的文档中

      和
    • 的格式完全错乱。

      问题代码:

      $docx = new CreateDocx();
      $docx->setDefaultFont('Arial');
      $wordStyles = array('<table>' => 'LightListAccent3PHPDOCX', '<h1>' => 'Heading1PHPDOCX' , '<h2>' => 'Heading2PHPDOCX' , '<h3>' => 'Heading3PHPDOCX' , '<h4>' => 'Heading4PHPDOCX' , '<h5>' => 'Heading5PHPDOCX' , '<h6>' => 'Heading6PHPDOCX');
      $docx->embedHTML($htmlContent, array('strictWordStyles' => false, 'wordStyles' => $wordStyles));
      $docx->createDocxAndDownload('/tmp/'.$filename);
      

      问题截图:
      列表格式错乱效果

      解决方法

      1. 预处理HTML结构,移除
    • 内的

      标签

    • phpdocx对HTML嵌套结构的解析存在局限性,

    • 内嵌套

      会干扰列表样式的渲染。可以通过预处理HTML,将

      标签的内容直接合并到

    • 中:

      正则替换(适用于简单结构)

      // 替换<li>内的<p>标签,保留内容
      $htmlContent = preg_replace('/<li>\s*<p>(.*?)<\/p>\s*<\/li>/is', '<li>$1</li>', $htmlContent);
      

      DOMDocument处理(适用于复杂HTML结构)

      $dom = new DOMDocument();
      libxml_use_internal_errors(true); // 忽略HTML解析警告
      $dom->loadHTML($htmlContent);
      libxml_clear_errors();
      
      $lis = $dom->getElementsByTagName('li');
      foreach ($lis as $li) {
          $ps = $li->getElementsByTagName('p');
          // 遍历<li>内的所有<p>标签
          while ($ps->length > 0) {
              $p = $ps->item(0);
              // 将<p>的子节点移动到<li>下
              while ($p->firstChild) {
                  $li->insertBefore($p->firstChild, $p);
              }
              // 删除空的<p>标签
              $li->removeChild($p);
          }
      }
      $htmlContent = $dom->saveHTML();
      

      2. 调整embedHTML参数,优化样式解析

      尝试开启strictWordStyles参数为true,或自定义列表样式,确保phpdocx正确识别列表格式:

      $docx->embedHTML($htmlContent, array(
          'strictWordStyles' => true,
          'wordStyles' => $wordStyles,
          'customListStyles' => array(
              'unorderedList' => array(
                  'style' => 'ListParagraph',
                  'format' => 'bullet',
                  'left' => 720, // 缩进值,单位为twip
                  'hanging' => 360
              )
          )
      ));
      

      3. 升级phpdocx到最新版本

      旧版本的phpdocx可能存在HTML嵌套解析的bug,升级到官方最新版本,可能已修复相关兼容性问题。


      内容的提问来源于stack exchange,提问作者igen

  • 相关产品推荐
    方舟 Agent Plan

    超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

    最近更新时间:2026.08.05 21:40:25