将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);
代码说明
- 自定义函数
getSeparatedText:- 通过XPath查询目标节点下所有文本节点,精准提取嵌套标签内的文本
- 过滤掉空文本(如换行、多余空格),只保留有效内容
- 可自定义分隔符(默认使用
,,也可改为;或空格等)
- 替换原逻辑:将直接提取
nodeValue的代码替换为自定义函数调用,解决文本合并问题 - 添加列数判断:避免因表格结构异常导致的索引越界报错
效果示例
针对示例中的表格,转换后输出的JSON为:
[ {"attr":"Col1","val":"Micro Tower"}, {"attr":"Col2","val":"Micro-ATX, Mini-ITX"}, {"attr":"Col3","val":"Test1, Test2"} ]
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

