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

将HTML表格转换为PHP数组时的文本合并问题及解决需求

解决HTML表格嵌套标签文本合并问题

问题场景

用PHP解析固定两列的HTML表格时,若单元格包含<p>、<div>、<span>等嵌套标签,直接通过nodeValue提取文本会导致所有子节点文本无分隔合并(如Micro-ATXMini-ITX),可读性极差,需要给这类文本添加分隔符(逗号、空格等)。

解决方案

替换直接获取nodeValue的逻辑,自定义函数遍历目标节点下的所有文本节点,过滤空文本后用指定分隔符拼接。

修改后的完整代码

$xml = new DOMDocument('1.0', 'utf-8');
libxml_use_internal_errors(true);
$xml->loadHTML('<?xml encoding="utf-8" ?>'.$content);

$xpath = new DOMXPath($xml);
$table = $xpath->query("//*[@class='".$autoAttributeHtmlClass."']");

$length = $table->length;

$j = 0;
$attrArr = array();

// 自定义函数:提取节点下所有文本并添加分隔符
function getSeparatedText($node, $separator = ', ') {
    $texts = array();
    $xpath = new DOMXPath($node->ownerDocument);
    // 遍历节点下所有非空文本节点
    foreach ($xpath->query('.//text()', $node) as $textNode) {
        $trimmedText = trim($textNode->nodeValue);
        if (!empty($trimmedText)) {
            $texts[] = $trimmedText;
        }
    }
    return implode($separator, $texts);
}

for ($i=0; $i <= $length-1; $i++) { 
    $element = $table->item($i);
    $rows = $element->getElementsByTagName("tr");

    foreach ($rows as $row) 
    { 
        $cols = $row->getElementsByTagName('td'); 
        if ($cols->length >= 2) { // 确保有两列,避免结构异常报错
            $attrArr[$j]['attr'] = rtrim($cols->item(0)->nodeValue, ':');
            // 使用自定义函数获取带分隔符的文本
            $attrArr[$j]['val'] = htmlspecialchars(getSeparatedText($cols->item(1)));
            $j++;
        }
    }
}

echo json_encode($attrArr); 

代码说明

  1. 自定义函数getSeparatedText:
    • 通过XPath查询目标节点下所有文本节点,精准提取嵌套标签内的文本
    • 过滤掉空文本(如换行、多余空格),只保留有效内容
    • 可自定义分隔符(默认使用, ,也可改为; 或空格等)
  2. 替换原逻辑:将直接提取nodeValue的代码替换为自定义函数调用,解决文本合并问题
  3. 添加列数判断:避免因表格结构异常导致的索引越界报错

效果示例

针对示例中的表格,转换后输出的JSON为:

[
    {"attr":"Col1","val":"Micro Tower"},
    {"attr":"Col2","val":"Micro-ATX, Mini-ITX"},
    {"attr":"Col3","val":"Test1, Test2"}
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:30:54