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

PHP处理HTML血液报告:无法按需求拆分元素至数组的问题

血液报告HTML内容拆分问题解决方案

问题背景

需要处理客户提供的HTML格式血液报告,通过PHP清理内容、拆分数据并整合到表格,但目前无法将类表格元素拆分成符合要求的数组。

原始HTML代码片段

<HR>
    <PRE><B><U><FONT COLOR="BLUE">HAEMATOLOGY</FONT></U></B>
HAEMOGLOBIN (g/L)              144                  g/L        115  - 155
HCT                            0.424                           0.33 - 0.45
RED CELL COUNT                 4.79                 x10^12/L   3.95 - 5.15
MCV                            88.5                 fL           80 - 99
MCH                            30.1                 pg         27.0 - 33.5
                               Please note new reference range.
MCHC (g/L)                     340                  g/L         300 - 350
RDW                            13.2                            11.5 - 15.0
PLATELET COUNT                 <FONT Color="red"><B>* 407                x10^9/L    150  - 400</B></FONT>
MPV                            9.6                  fL            7 - 13
WHITE CELL COUNT               6.16                 x10^9/L     3.0 - 10.0
  Neutrophils                  60.3%  3.71          x10^9/L     2.0 - 7.5
  Lymphocytes                  29.9%  1.84          x10^9/L     1.2 - 3.65
  Monocytes                     6.7%  0.41          x10^9/L     0.2 - 1.0
  Eosinophils                   2.1%  0.13          x10^9/L     0.0 - 0.4
  Basophils                     1.0%  0.06          x10^9/L     0.0 - 0.1
                               All cell populations appear normal.

<B><U><FONT COLOR="BLUE">BIOCHEMISTRY</FONT></U></B>

当前问题

处理后数组存在内容未拆分的情况,例如:

22 => string 'HAEMOGLOBIN               160                          130' (length=98)

期望输出

每个字段单独成为数组元素:

22 => string 'HAEMOGLOBIN' (length...)
23 => string '160' (length...)
24 => string '130' (length...)

现有PHP代码

$myfile = file_get_contents($fileURL);
$fileString = file_get_contents($fileURL);
$parts = $fileString;


$flags = PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY;
// remove HTML code
$part_regex = '/(&lt;)(.*?)(&gt;)/';
$parts = preg_replace($part_regex, '', $parts);
//Remove unecessary deliminaters 
$parts = str_replace('|', '', $parts);
$parts = str_replace('-', '', $parts);
$parts = str_replace('(g/L)', '', $parts);
$parts = str_replace('g/L', '', $parts);
$parts = str_replace('&amp;nbsp;', ' ', $parts);
//Split file string based on spaces
$regex = '/\s\s+/';
$parts = preg_split( $regex, $parts, -1, $flags);
foreach ($parts as $part) {

        //$part = str_replace('&amp;nbsp;', '|', $part);
        $part = trim($part);
        if ($part == '') { unset($part);}
        else {
        $cleanpart = $part;
        array_push($cleanfile, $cleanpart);    
        }  
    }

var_dump($cleanfile);

解决方案

原代码的核心问题是未正确处理HTML实体(如&nbsp;)和非标准空白字符,以下是优化后的代码:

优化后代码

$fileString = file_get_contents($fileURL);
$cleanfile = [];

// 1. 移除所有HTML标签,PHP内置函数比自定义正则更可靠
$parts = strip_tags($fileString);

// 2. 解码所有HTML实体(包括&nbsp;等特殊空白)
$parts = html_entity_decode($parts, ENT_QUOTES | ENT_HTML5);

// 3. 统一替换所有空白字符(空格、制表符、换行等)为单个空格
$parts = preg_replace('/[\s\x00-\x1F\x7F]+/', ' ', $parts);

// 4. 按任意数量空格拆分,保留非空元素
$parts = preg_split('/\s+/', trim($parts), -1, PREG_SPLIT_NO_EMPTY);

// 5. 可选:清理数值前的*符号,处理参考范围的-
foreach ($parts as $part) {
    // 移除数值前的*
    $cleanPart = ltrim($part, '*');
    // 若不需要参考范围的-,可取消下面注释
    // $cleanPart = str_replace('-', '', $cleanPart);
    $cleanfile[] = $cleanPart;
}

var_dump($cleanfile);

关键改进点

  1. strip_tags替代自定义正则:可靠移除所有HTML标签,避免遗漏复杂标签结构
  2. html_entity_decode解码实体:正确转换&nbsp;(ASCII 160)为普通空格,这是原代码拆分失败的核心原因
  3. 统一空白字符:用正则匹配所有空白和控制字符,替换为单个空格,确保拆分一致性
  4. 更健壮的拆分正则:/\s+/匹配任意数量的空白字符,覆盖所有空白场景
  5. 灵活的后处理:单独清理数值前的*符号,避免全局移除-破坏数据结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:54:57