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 = '/(<)(.*?)(>)/'; $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('&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('&nbsp;', '|', $part); $part = trim($part); if ($part == '') { unset($part);} else { $cleanpart = $part; array_push($cleanfile, $cleanpart); } } var_dump($cleanfile);
解决方案
原代码的核心问题是未正确处理HTML实体(如 )和非标准空白字符,以下是优化后的代码:
优化后代码
$fileString = file_get_contents($fileURL); $cleanfile = []; // 1. 移除所有HTML标签,PHP内置函数比自定义正则更可靠 $parts = strip_tags($fileString); // 2. 解码所有HTML实体(包括 等特殊空白) $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);
关键改进点
strip_tags替代自定义正则:可靠移除所有HTML标签,避免遗漏复杂标签结构html_entity_decode解码实体:正确转换 (ASCII 160)为普通空格,这是原代码拆分失败的核心原因- 统一空白字符:用正则匹配所有空白和控制字符,替换为单个空格,确保拆分一致性
- 更健壮的拆分正则:
/\s+/匹配任意数量的空白字符,覆盖所有空白场景 - 灵活的后处理:单独清理数值前的*符号,避免全局移除
-破坏数据结构
内容的提问来源于stack exchange,提问作者nathanhunt79
相关产品推荐
相关产品推荐

