应优先使用 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;防止中断整个流程 - 不要在循环里反复
file_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,此时要检查是否意外递归引用了自身变量。
立即学习“PHP免费学习笔记(深入)”;
实际批量处理时,最易被忽略的是输入文本的编码一致性(比如混着 GBK 和 UTF-8)和空行判定逻辑——看似简单,一不留神就漏掉第一篇或吞掉最后一篇。











