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

Laravel 5.6中使用Smalot\PdfParser提取PDF内容后,按空格分割字符串并提取指定字段的实现问题

解决PDF解析后的数据拆分问题

看起来你之前的代码因为错误的字符串清理步骤,导致拆分后的数组元素缺失,才会出现索引0未定义的错误。我们先理清每行数据的结构,再一步步修复代码:

问题分析

你拿到的每行数据结构是固定的:
[第二姓氏] [姓氏] [名字(可能多个单词)] [街道名 门牌号] [电话四段数字]
比如第一行:MARTIN CARRILLO MARIA ESMERALDA ALHAMBRA 10 958 54 38 93

之前的substr($line, 0,7)和错误的正则替换,会把有效内容删掉,导致拆分后的数组为空或不完整,这就是索引未定义的根源。

完整解决方案

1. 初始化收集数组

先定义好要存储各字段的数组:

$secondSurnames = [];
$surnames = [];
$names = [];
$addresses = [];
$phones = [];

2. 循环处理每行数据

去掉错误的清理步骤,按空格拆分后,根据固定位置提取字段:

foreach ($dataByLine as $line) {
    // 先去除首尾空格,再按任意数量空格拆分,过滤空元素
    $parts = preg_split('/\s+/', trim($line), -1, PREG_SPLIT_NO_EMPTY);
    
    // 跳过不符合结构的行,避免索引错误
    if (count($parts) < 9) { // 最少需要:第二姓+姓+1个名字+地址2个+电话4个 = 9个元素
        continue;
    }
    
    // 提取第二姓氏(第一个元素)
    $secondSurnames[] = $parts[0];
    // 提取姓氏(第二个元素)
    $surnames[] = $parts[1];
    
    // 提取名字:从第3个元素开始,到地址前结束(总长度减去8:1+1+2+4)
    $nameLength = count($parts) - 8;
    $nameParts = array_slice($parts, 2, $nameLength);
    $names[] = implode(' ', $nameParts);
    
    // 提取地址:倒数第6到倒数第5个元素(街道名+门牌号)
    $addressParts = array_slice($parts, -6, 2);
    $addresses[] = implode(' ', $addressParts);
    
    // 提取电话:最后4个元素,用空格连接
    $phoneParts = array_slice($parts, -4);
    $phones[] = implode(' ', $phoneParts);
}

3. 合并数组生成数据库插入语句

把收集到的字段数组合并成关联数组,再生成批量插入SQL:

// 合并为结构化记录
$records = [];
$total = count($secondSurnames);
for ($i = 0; $i < $total; $i++) {
    $records[] = [
        'second_surname' => $secondSurnames[$i],
        'surname' => $surnames[$i],
        'name' => $names[$i],
        'address' => $addresses[$i],
        'phone' => $phones[$i]
    ];
}

// 生成批量插入SQL(假设表名为`contacts`)
if (!empty($records)) {
    // 获取字段名
    $columns = implode(', ', array_keys($records[0]));
    // 组装值列表
    $valueGroups = [];
    foreach ($records as $record) {
        // 转义特殊字符(Laravel中可以用DB::quote()更安全)
        $escapedValues = array_map(function($val) {
            return "'" . addslashes($val) . "'";
        }, $record);
        $valueGroups[] = "(" . implode(', ', $escapedValues) . ")";
    }
    $insertSql = "INSERT INTO contacts ($columns) VALUES " . implode(', ', $valueGroups);
    
    // 用Laravel执行语句
    // \Illuminate\Support\Facades\DB::statement($insertSql);
}

关键修复点

  • 去掉了错误的substr和preg_replace操作,保留了原始数据的完整性
  • 添加了行结构校验,避免因数据异常导致的索引错误
  • 使用array_slice灵活提取不同位置的元素,适配名字可能包含多个单词的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:48:11