最简单用explode("\t", $line),注意双引号;含空字段或连续制表符用preg_split('/\\t/', $line, -1, PREG_SPLIT_NO_EMPTY);真实TSV应优先用fgetcsv($fp, 0, "\t");需预处理BOM和换行符。

php用explode()按制表符分割最简单
直接用 explode() 是最轻量、最常用的方式,适合纯文本、无嵌套结构的场景。制表符在 PHP 中写作 "\t",注意必须用双引号包裹,单引号不会解析转义。
常见错误是写成 explode('\t', $str) —— 这会按字面字符 \t(两个字符)切分,不是真正的制表符。
-
explode("\t", $line)正确,适用于每行字段严格由单个\t分隔的情况 - 若某字段本身含
\t(比如用户输入未过滤),explode()会误切,此时不能用 - 性能上比正则快 3–5 倍,尤其处理大文件时差异明显
用preg_split()处理含空字段或连续制表符
当原始数据可能出现 \t\t(空列)、行首/行尾制表符,或需要保留空字段时,explode() 会丢弃空值,而 preg_split() 可控性更强。
关键参数是 PREG_SPLIT_NO_EMPTY 和 PREG_SPLIT_DELIM_CAPTURE —— 大多数情况只需前者。
立即学习“PHP免费学习笔记(深入)”;
- 保留空字段:
preg_split('/\t/', $line, -1, PREG_SPLIT_NO_EMPTY)不加标志时默认保留空项 - 忽略首尾空白后切分:
preg_split('/\s*\t\s*/', trim($line)),适合脏数据预处理 - 避免回溯爆炸:别写
/[\t]+/去匹配“一个或多个制表符”,除非明确需要合并连续分隔符;普通场景用/\t/更安全
读取TSV文件时别只靠preg_split()
真实 TSV(Tab-Separated Values)常含换行符、引号包裹字段、转义制表符等,此时 preg_split() 或 explode() 都会出错。
PHP 内置的 fgetcsv() 支持自定义分隔符,是更鲁棒的选择:
while (($row = fgetcsv($fp, 0, "\t")) !== false) {
// $row 已正确处理引号、换行、空字段
}
-
fgetcsv()自动处理字段内含\t或换行的情况(只要被双引号包裹) - 不支持带转义符的 TSV(如
field1\tfield2\tfield\t3中最后的\t是字面量),需额外解析逻辑 - 内存友好:逐行读取,不用
file_get_contents()一次性加载整个文件
注意 Windows 换行和 BOM 对制表符分割的影响
从 Excel 或记事本导出的 TSV 文件,可能带 UTF-8 BOM(\xEF\xBB\xBF)或 \r\n 换行,导致首字段开头多出不可见字符,explode("\t", $line) 切出来第一个字段带前缀。
- 读取前先去 BOM:
$line = preg_replace('/^\xEF\xBB\xBF/', '', $line) - 统一换行符:
$line = str_replace(["\r\n", "\r"], "\n", $line),再trim()掉末尾换行 - 调试时用
bin2hex($line)查看真实字节,比var_dump()更可靠
bin2hex() 看几行原始字节再决定用哪个函数。











