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

PHP中PDF提取字符串数组转表格数据:含空格客户名处理难题

解决PDF提取数据中客户名含空格的拆分问题

遇到这种空格作为分隔符但部分字段包含空格的情况,绝对不能用简单的explode(' ', $line)——它会把带空格的客户名拆成多个零散字段。正确的思路是利用其他字段的固定格式,用正则表达式精准捕获每个字段,而非依赖空格作为通用分隔符。

具体实现步骤

从你的示例数据来看,除了客户名(可能包含空格、连字符、撇号),其他字段都有明确的格式:

  • ID/OrderID:纯数字
  • 日期:d.m.yyyy或dd.mm.yyyy格式
  • 产品编号:字母+数字(可选后缀字母),比如A12345678A
  • 后续字段:全是数字(整数或带小数的数值)

基于这个规律,可以用以下PHP代码处理每一行数据:

// 示例行数据(含带空格的客户名)
$line = "16842 90143020 7.1.2018 Customer One Denver A12345678A 3.900 0 0 0 0 5.000 5.150 0 0 0 0 0 0";

// 第一步:捕获前三个固定格式的字段(ID、OrderID、日期)
preg_match('/^(\d+) (\d+) (\d{1,2}\.\d{1,2}\.\d{4}) /', $line, $headerMatches);
$id = $headerMatches[1];
$orderId = $headerMatches[2];
$date = $headerMatches[3];

// 截取前三个字段之后的剩余字符串
$remainingStr = substr($line, strlen($headerMatches[0]));

// 第二步:捕获客户名、产品编号,以及后续的数字字段
// 非贪婪匹配会把产品编号之前的所有内容(含空格)完整作为客户信息
preg_match('/(.+?) ([A-Za-z]+\d+[A-Za-z]?) (.*)/', $remainingStr, $bodyMatches);
$customerInfo = trim($bodyMatches[1]); // 比如"Customer One Denver",可根据业务规则拆分客户名/地址
$productCode = $bodyMatches[2];
$numericValues = array_filter(explode(' ', trim($bodyMatches[3])), function($val) {
    return $val !== ''; // 过滤PDF提取时可能出现的连续空格导致的空字符串
});

// 整理成最终的结构化数据
$rowData = [
    'ID' => $id,
    'OrderID' => $orderId,
    'Date' => $date,
    'Customer' => $customerInfo,
    'ProductCode' => $productCode,
    'Values' => $numericValues
];

// 输出测试
print_r($rowData);

关键说明

  1. 前三个字段的精准匹配:用^(\d+) (\d+) (\d{1,2}\.\d{1,2}\.\d{4}) 锁定开头的数字ID、订单号和日期,确保这部分不会被错误拆分。
  2. 客户名的完整捕获:(.+?)非贪婪匹配会抓取产品编号之前的所有内容,不管中间有多少空格,都会完整保留客户名(比如Customer One)或客户名+地址的组合。
  3. 数字字段的安全拆分:产品编号之后的内容都是纯数字,这时候用explode就完全安全了——这些字段之间的空格是可靠的分隔符,最后用array_filter清理可能的空字符串。

边界情况处理

如果客户名包含特殊字符(比如Billy's CoffeShop),上述正则依然有效,因为(.+?)会匹配除换行外的所有字符,包括撇号、连字符等。如果产品编号格式有变化,只需调整正则中匹配产品编号的部分(比如[A-Za-z0-9-]+如果包含连字符)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:56