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

PHP生成含URL与标题的CSV异常:仅显示最后一个URL标题

问题原因与修复方案

问题根源

  1. 变量覆盖:你初始化了$title = [],但在遍历URL的循环中,每次都将单个标题字符串赋值给$title,这会覆盖之前的所有结果,最终$title只保留最后一个URL的标题。
  2. 对应关系丢失:写入CSV时,所有URL都复用同一个$title值,导致所有行都显示最后一个标题。

修复后的代码

<?php
ini_set('max_execution_time', 0); // 设置为0表示无超时限制

include('simple_html_dom.php');

// 读取原始CSV文件的URL
$arraydata = [];
if (($csv_file = fopen("old.csv", "r")) !== FALSE) {
    while (($read_data = fgetcsv($csv_file, 1000, ",")) !== FALSE) {
        foreach ($read_data as $url) {
            // 过滤空URL,避免无效请求
            if (!empty(trim($url))) {
                $arraydata[] = trim($url);
            }
        }
    }
    fclose($csv_file);
}

// 存储每个URL对应的标题
$urlTitles = [];
foreach ($arraydata as $url) {
    $html = file_get_html($url);
    // 初始化标题为空,避免获取失败时无值
    $title = '';
    if ($html) {
        $titleElement = $html->find('title', 0);
        if ($titleElement) {
            $title = $titleElement->plaintext;
            // 清理标题中的换行、逗号等可能破坏CSV格式的字符
            $title = str_replace(["\n", "\r", ","], ["", "", " "], $title);
        }
        // 释放DOM资源,避免内存泄漏
        $html->clear();
        unset($html);
    }
    $urlTitles[$url] = $title;
}

// 写入新的CSV文件
$ncsv = fopen("updated.csv", "w"); // 用w模式覆盖,避免重复追加表头
// 使用fputcsv处理CSV格式,自动处理特殊字符
fputcsv($ncsv, ["Url", "Title"]);

foreach ($arraydata as $url) {
    fputcsv($ncsv, [$url, $urlTitles[$url]]);
}

fclose($ncsv);
?>

关键修改点

  • 改用$urlTitles数组存储每个URL对应的标题,保留URL与标题的对应关系。
  • 使用fputcsv替代fwrite,自动处理标题中的逗号、引号等特殊字符,保证CSV格式正确。
  • 添加空URL过滤、标题清理、DOM资源释放的逻辑,提升代码稳定性和健壮性。
  • 将文件打开模式从a改为w,避免多次运行时重复追加表头和内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:25:27