




应优先使用 preg_split() 并配合 trim() 和 PREG_SPLIT_NO_EMPTY 标志来分割多篇文本,以准确处理空行、跨平台换行符及首尾空白;后续用 foreach 遍历处理每篇文章。
explode() 或 preg_split() 按分隔符切文本,但要注意空行和边界PHP 里批量处理多篇文本,核心是先“切开”,再逐篇处理。最常用的是 explode(),比如按 "\n\n"(两个换行)切分多篇文章;但实际中常遇到开头空行、结尾多余换行、Windows 的 "\r\n" 导致切不准。这时候 preg_split() 更稳:preg_split('/\s*\n\s*\n\s*/', trim($text), -1, PREG_SPLIT_NO_EMPTY) —— 自动清理首尾空白、忽略换行前后的空格,并跳过空结果。
explode("\n\n", $text),原始文本带 \r 时会残留 "\r" 在每段开头trim() 原始文本,否则首尾空段会进数组PREG_SPLIT_NO_EMPTY 标志,避免因连续多个空行产生空字符串foreach 而非 for + count()
切完得到一个数组,比如 $articles = [...],接下来要对每篇做清洗、提取标题、存数据库等操作。用 foreach ($articles as $index => $article) 最安全:不依赖索引连续性,也不用反复调用 count(),PHP 内部迭代效率更高。若需编号(如日志标记第几篇),$index 就是天然序号,从 0 开始——注意是否要加 1 显示。
for ($i = 0; $i :每次循环都重新算数组长度,小数据不明显,批量大时有性能损耗
try/catch 或 if (empty($article)) continue; 防止中断整个流程fil
e_put_contents() 写同一文件,应拼好再写一次,或用 fopen(..., 'a')
file_get_contents()
单个文本几 MB 还好,但如果是几十 MB 的合集文件,file_get_contents() 会把全部内容载入内存,容易触发 Fatal error: Allowed memory size exhausted。这时得改用流式读取:用 fopen() + fgets() 或 stream_get_line() 逐行攒段,检测到空行就提交一篇,清空缓存变量。
$handle = fopen($path, 'r'); 打开后,while (($line = fgets($handle)) !== false) 一行行读$current_article 字符串,遇到空行(trim($line) === '')就处理并重置它fclose($handle),否则文件句柄泄漏,后续可能报 Too many open files
json_encode() 中文乱码和嵌套深度处理完每篇,常要转成 JSON 存文件或传接口。默认 json_encode() 对中文输出 Unicode 编码(如 "\u4f60\u597d"),看着像乱码;加 JSON_UNESCAPED_UNICODE 即可。另外,如果某篇文章结构太深(比如嵌套数组超 512 层),会报 Maximum stack depth exceeded,此时要检查是否意外递归引用了自身变量。
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE)
JSON_INVALID_UTF8_SUBSTITUTE 可防止含损坏 UTF-8 字节的文本导致整个编码失败JSON_PRETTY_PRINT,但线上环境慎用,体积增大且无必要